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

时间:2015-06-26 17:43:00

标签: python numpy wrapper swig overloading

我正在使用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用于此目的?

1 个答案:

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

在其他更具体的情况下可能存在各种黑客攻击,但这是一般解决方案。