3

PyBindGen 的文档说为您自己的数据类型编写自定义类型处理程序很容易。但是,我没有找到任何编写它们的好例子。pybindgen 提供的示例太基础了,无法理解细节,不幸的是,文档几乎不存在。我真正需要的是:

  • 我需要使用哪个类作为转换器的基础?
  • 我必须重载哪些方法来扩展或替换绑定代码的特定部分?
  • 我应该使用什么方法来处理 const 和非常量参数?

是否有任何完整且有据可查的示例将自定义类型处理程序添加到 pybindgen?可能有人为您自己的项目这样做并可能分享一种方法?

我当前绑定的一个示例,以更好地了解我需要什么。目前使用 Boost.python 完成:

PyObject* System_getXYZ(System* s, int ind, int fr){
  CREATE_PYARRAY_1D(p,3)
  MAP_EIGEN_TO_PYARRAY(v,Vector3f,p)
  v = s->XYZ(ind,fr);
  return boost::python::incref(p);
}   

...
class_<System, boost::noncopyable>("System", init<>())
  ...
  .def("getXYZ", &System_getXYZ)
  ...
;

方法 System::XYZ() 返回一个 Eigen::Vector3f 对象。它必须在复制其数据的情况下转换为 numpy 数组。这很重要,因为整个想法都是关于效率的。目前它是通过丑陋的宏来完成的:

#define MAP_EIGEN_TO_PYARRAY(_matr,_T,_obj_ptr) \
    if(!PyArray_Check(_obj_ptr)) throw pteros::Pteros_error("NumPy array expected!"); \
    if(PyArray_TYPE(_obj_ptr)!=PyArray_FLOAT) throw pteros::Pteros_error("float NumPy array expected!"); \
    Eigen::Map<_T> _matr((float*) PyArray_DATA(_obj_ptr), \
            (PyArray_DIM((PyArrayObject*)_obj_ptr,0)==PyArray_Size(_obj_ptr)) ? PyArray_DIM(
            (PyArray_DIM((PyArrayObject*)_obj_ptr,0)==PyArray_Size(_obj_ptr)) ? 1 : PyArray_


#define CREATE_PYARRAY_1D(_ptr_obj, _dim1) \
    PyObject* _ptr_obj; \
    { \
        npy_intp _sz_dim1[1];\
        _sz_dim1[0] = _dim1; \
        _ptr_obj = PyArray_SimpleNew(1, _sz_dim1, PyArray_FLOAT); \
    }

它可以工作,但我需要为每个方法编写一个包装函数,它采用 Eigen 对象,这是维护的噩梦。这就是为什么我想尝试 PyBindGen 并在那里创建一个转换器,它会自动添加来自这些宏的所有样板代码。

顺便说一句,boost.python 转换器在这里没有帮助,因为它们强制复制数据。

4

0 回答 0