SWIG - 在extend内部使用typemap

时间:2014-02-11 01:21:54

标签: python c++ swig

我编写了一个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列表,但我找不到任何示例。

感谢您的帮助。

1 个答案:

答案 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。