在Python SWIG中包装void *参数

我用Python SWIG包装这个lib,它有一个如下所示的函数:

int set_option(Foo *foo, const char *name, void *value); 

在lib const char *name中映射到我有权查询的类型: intchar *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; };