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

Using SWIG typemaps to generate overloaded Python wrapper

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

考虑包装以下函数:

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

我希望能够使用 Python 列表 AND NumPy 数组作为输入来调用这些函数(而不必创建 Spam::Vector 对象在 Python 中然后使用关联的 C++ 方法填充它 - 它非常 unpythonic).

我将如何着手编写 SWIG 类型映射来实现这一点?另外,有没有办法 incorporate/leverage numpy.i 为此目的?

正确的方法是使用自定义类型映射。确切地说,它的外观很大程度上取决于类型 Spam::Vector 本身。一般来说,虽然你可以用这样的东西来做到这一点:

%typemap(in) {
  // Maybe you'd rather check for iterable here, with this check after numpy?
  if (PyList_Check($input)) {
     = ... // Code to iterate over a list and prepare a Spam::Vector
  }
  else if (PyType_IsSubtype($input->ob_type, NumpyType)) {
     = ... // Code to convert from numpy input
  }
  else {
    // code to raise an error
  }
}

在其他更具体的情况下可能有各种破解方法,但这是通用的解决方案。