使用 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
}
}
在其他更具体的情况下可能有各种破解方法,但这是通用的解决方案。
我正在使用 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
}
}
在其他更具体的情况下可能有各种破解方法,但这是通用的解决方案。