使用SWIG类型映射生成重载Python包装器

使用SWIG类型映射生成重载Python包装器,python,numpy,wrapper,swig,overloading,Python,Numpy,Wrapper,Swig,Overloading,我使用SWIG为一个用C++编写的库(称之为Spam)生成Python绑定。该库在内部定义自己的向量数据类型,在Spam::Vector类中定义 考虑以下要包装的函数: void ham(Spam::Vector &vec_in, Spam::Vector &vec_out); void eggs(Spam::Vector &vec_in, double arg2, double result); 我希望能够用python列表和 Nuffy数组调用这些函数(而不是在Py

我使用SWIG为一个用
C++
编写的库(称之为
Spam
)生成Python绑定。该库在内部定义自己的向量数据类型,在
Spam::Vector
类中定义

考虑以下要包装的函数:

void ham(Spam::Vector &vec_in, Spam::Vector &vec_out);
void eggs(Spam::Vector &vec_in, double arg2, double result);

我希望能够用python列表<强>和 Nuffy数组调用这些函数(而不是在Python中创建<代码>垃圾邮件::vector < /COD>对象,然后使用相关的C++方法填充它——它非常unpythic)。


我将如何编写SWIG类型图来实现这一点?此外,是否有一种方法可以为此目的合并/利用
numpy.i

正确的方法是使用自定义类型映射。确切的外观取决于类型
Spam::Vector
本身。一般来说,您可以通过以下方式实现:

%typemap(in){
//也许你更愿意在这里检查一下iterable,在numpy之后用这张支票?
if(PyList_检查($input)){
$1=…//迭代列表并准备Spam::Vector的代码
}
else if(PyType_IsSubtype($input->ob_type,NumpyType)){
$1=…//要从numpy输入转换的代码
}
否则{
//引发错误的代码
}
}

在其他更具体的情况下,可能会出现各种各样的攻击,但这是一般的解决方案。

您的
vec_in
参数是否意味着常量?还有,
Spam::Vector
内部是什么样子的?这将影响如何最好地包装它。是的,
vec_in
是常量。没有关于
Spam::Vector
内部外观的信息,因为该库是专有的。我只能访问
DLL
。好的,但它是否有一个构造函数,以指针大小和数组大小为例?如果没有它,就不可能知道如何将它与numpy接口。是的,它有一个以大小作为输入的构造函数。但我认为你没有抓住我问题的重点。我可以了解包装细节,但是我需要知道如何确保函数能够接受Python列表或Numpy数组(或任何其他2种类型)的参数。我想写一个包装器,可以动态检测参数的“类型”,并在必要时进行适当的转换。我理解这一点,但我希望写一个对这两种情况都有效的答案。我将只写一个简短的回答,概述原则,然后跳过细节。