【发布时间】:2023-03-18 04:23:01
【问题描述】:
我编写了一个 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 列表的方法,但我找不到任何示例。
提前感谢您的帮助。
【问题讨论】:
-
为什么需要类型映射? %extend 应该足以让您添加一个构造函数,该构造函数采用 std::list 和 std_list.i SWIG 将为您完成一切。