首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SWIG:如何根据原始返回值绘制返回值的类型?

SWIG:如何根据原始返回值绘制返回值的类型?
EN

Stack Overflow用户
提问于 2014-09-03 17:59:26
回答 2查看 1.4K关注 0票数 2

下面是一个非常简单的C函数:

代码语言:javascript
复制
bool GetSomething(string* result)

调用此函数后,返回值应指示result是否保存所需信息,用户可以检查返回值以相应处理。

要在Python代码中使用这个函数,我使用默认的typemaps.i文件,然后将函数更改为

代码语言:javascript
复制
bool GetSomething(string* OUTPUT)

这是可行的,但仍然很麻烦。我必须这样做才能得到我想要的结果:

代码语言:javascript
复制
success, result = GetSomething()
if success:
    # handle result
else:
    # throw exception

理想情况下,我希望有这个接口,而不是:

代码语言:javascript
复制
result = GetSomething()
if result:
    # handle result

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-05 03:04:36

下面是注释中提到的想法的一个示例.i文件。将成功的返回状态转换为None,将失败的返回状态转换为异常,并将输出参数附加到返回值中。这不需要更改C++代码库:

代码语言:javascript
复制
%module x

%include <exception.i>

// convert non-zero int return values to exceptions
%typemap(out) int %{
    if($1)
        SWIG_exception(SWIG_RuntimeError,"non-zero return value");
    $result = Py_None;
    Py_INCREF(Py_None); // Py_None is a singleton so increment its reference if used.
%}

// Easy way for int*, but customize below for more complicated types
// %apply int* OUTPUT {int*};

// suppress the output parameter as an input.
%typemap(in,numinputs=0) int* (int tmp) %{
    $1 = &tmp;
%}

// append int* output parameters to the return value.
%typemap(argout) int* {
    PyObject* tmp = PyLong_FromLong(*$1);
    $result = SWIG_Python_AppendOutput($result,tmp);
}

// %inline declares and exposes a function
%inline %{
    int func(int val, int* pOut)
    {
        if(val < 1)
            return 1;
        *pOut = 2 * val;
        return 0;
    }
%}

如果您使用.i并将结果编译为swig -python -c++ x.i扩展名,则可以使用swig -python -c++ x.i

代码语言:javascript
复制
>>> import x
>>> x.func(2)
4
>>> x.func(0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: non-zero return value
票数 5
EN

Stack Overflow用户

发布于 2014-09-04 15:43:08

我现在的黑客,希望这能帮到别人。

代码语言:javascript
复制
%{
 #define GetSomething 1
%}

%typemap(out) bool %{
#if $symname == 1
if (result) {
return Py_FromString(arg0->data());
} else {
return Py_None;
}
#endif
%}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25650761

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档