我用 Python SWIG 包装这个库,它的函数如下所示:
int set_option(Foo *foo, const char *name, void *value);
在库中,const char *name
映射到我有权查找的类型:int
、char *
、字符**
。
默认生成的包装器代码仅接受包装的 void *
(自然)。
让包装方法接受任何 Python 对象作为参数,并在我自己的 C 代码中进行类型检查和 Python 到 C 的转换的最佳方法是什么?
我的猜测是某种类型的映射,但可惜我无法弄清楚。
@好东西
In [12]: lib.set_option(foo, "option", "value")
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-4ccf706b5c50> in <module>()
----> 1 lib.set_option(foo, "option", "value")
TypeError: in method 'set_option', argument 3 of type 'void *'
最佳答案
如果您只想使用 %extend
将 PyObject
传递给某些内容,您可以修改您所拥有的内容并只需编写以下内容:
%extend Foo {
int set_option(const char *name, PyObject *value) {
// Here value is now a PyObject *, so work with that.
// $self is Foo *foo
return 0;
}
};
不需要类型映射,该函数现在接受任何 Python 输入。你用它做什么取决于你,如果你保留该对象,你将需要增加引用计数。
关于python - 在 Python SWIG 中包装 void * 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35124093/