在Python SWIG中包装void *参数
我用Python SWIG包装这个lib,它有一个如下所示的函数:
int set_option(Foo *foo, const char *name, void *value);
在lib const char *name
中映射到我有权查询的类型: int
, char *
, char **
。
默认生成的包装器代码只接受包装的void *
(自然)。
使包装方法接受任何 Python对象作为参数的最佳方法是什么,并在我自己的C代码中进行类型检查和Python到C转换?
我的猜测是某种类型的地图,但唉,我无法弄清楚。
@Goodies
In [12]: lib.set_option(foo, "option", "value") --------------------------------------------------------------------------- TypeError Traceback (most recent call last) in () ----> 1 lib.set_option(foo, "option", "value") TypeError: in method 'set_option', argument 3 of type 'void *'
如果你只想将PyObject
传递给使用%extend
东西,你可以修改你所拥有的东西并简单地写下面的内容:
%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输入。 你用它做什么取决于你,如果你保留对象,你需要增加引用计数。
原来这很简单。 我希望将value
作为PyObject *
因此我可以键入check并PyObject *
转换。 这是我想要包装的function:
int set_option(Foo *foo, const char *name, void *value);
这个解决方案也使它成为class Foo
的方法。
%extend Foo { int set_option(const char *name, void *value) { // Here value is now a PyObject *, so work with that. // $self is Foo *foo return 0; } }; %typemap(in) (void *value) { $1 = (void *) $input; };