我正在使用SWIG为Spam
中编写的库(我们称之为C++
)生成Python绑定。该库在内部定义了自己的Vector数据类型,在Spam::Vector
类中定义。
考虑以下要包装的功能:
void ham(Spam::Vector &vec_in, Spam::Vector &vec_out);
void eggs(Spam::Vector &vec_in, double arg2, double result);
我希望能够使用Python列表 AND NumPy数组作为输入来调用这些函数(而不是在Python中创建Spam::Vector
对象,然后使用关联填充它C ++方法 - 它非常 unpythonic )。
我如何编写SWIG类型图来实现这一目标?另外,有没有办法将numpy.i
用于此目的?
答案 0 :(得分:0)
执行此操作的正确方法是使用自定义类型映射。确切地说,这看起来很像取决于Spam::Vector
类型本身。一般情况下,您可以使用以下内容执行此操作:
%typemap(in) {
// Maybe you'd rather check for iterable here, with this check after numpy?
if (PyList_Check($input)) {
$1 = ... // Code to iterate over a list and prepare a Spam::Vector
}
else if (PyType_IsSubtype($input->ob_type, NumpyType)) {
$1 = ... // Code to convert from numpy input
}
else {
// code to raise an error
}
}
在其他更具体的情况下可能存在各种黑客攻击,但这是一般解决方案。