我编写了一个c ++类,我正在使用SWIG创建我的类的Python版本。我想重载构造函数,以便它可以接受Python列表。例如:
>>> import example
>>> a = example.Array([1,2,3,4])
我试图在swig中使用typemap功能,但是typemap的范围不包含extend
中的代码以下是我所拥有的类似例子......
%typemap(in) double[]
{
if (!PyList_Check($input))
return NULL;
int size = PyList_Size($input);
int i = 0;
$1 = (double *) malloc((size+1)*sizeof(double));
for (i = 0; i < size; i++)
{
PyObject *o = PyList_GetItem($input,i);
if (PyNumber_Check(o))
$1[i] = PyFloat_AsDouble(o);
else
{
PyErr_SetString(PyExc_TypeError,"list must contain numbers");
free($1);
return NULL;
}
}
$1[i] = 0;
}
%include "Array.h"
%extend Array
{
Array(double lst[])
{
Array *a = new Array();
...
/* do stuff with lst[] */
...
return a;
}
}
我知道typemap工作正常(我写了一个小的测试函数,只打印出double []中的元素。)
我尝试将typemap放在extend子句中,但这并没有解决问题。
也许还有另一种方法可以在扩展中使用Python列表,但我找不到任何示例。
感谢您的帮助。
答案 0 :(得分:1)
你真的很接近:而不是double lst[]
,延伸到std::list<double>
:
%include "std_list.i" // or std_vector.i
%include "Array.h"
%extend Array
{
Array(const std::list<double>& numbers) {
Array* arr = new Array;
...put numbers list items in "arr", then
return a; // interpreter will take ownership
}
}
SWIG应该自动将Python列表转换为std :: list。