1 回答
TA贡献1772条经验 获得超6个赞
您应该PyRectangle在def-functions的签名中以及PyRectangle.c_rect在将矩形传递给 C++-functions 时使用。
这意味着您的代码应该是:
cdef class PyGroup2:
...
def __cinit__(self, PyRectangle rect0, PyRectangle rect1):
self.c_group2 = Group2(rect0.c_rect, rect1.c_rect)
请继续阅读以获取更详细的解释。
传递给def-functions 的所有参数都是 Python 对象(即objectCython 说法中的类型),毕竟这些函数将从纯 Python 中调用,而纯 Python 只知道 Python 对象。
但是,您可以添加一些语法糖并在def- 函数的签名中使用“后期绑定” ,例如,而不是
def do_something(n):
...
用
def do_something(int n):
...
在幕后,Cython 会将此代码转换为类似以下内容:
def do_something(n_):
cdef int n = n_ # conversion to C-int
...
这种自动转换对于像int或这样的内置类型是可能的double,因为 Python-C-API 中有这些转换的功能(即PyLong_AsLong, PyFloat_AsDouble)。Cython 还处理错误检查,因此您不应手动进行这些转换。
但是,对于像您的Rectangle-class 这样的用户定义类型/类,这种自动转换是不可能的 - Cython 只能自动转换为cdef-classes/extensions,即PyRectangle,因此PyRectangle应该在签名中使用:
cdef class PyGroup2:
...
def __cinit__(self, PyRectangle rect0, PyRectangle rect1):
...
在 Cython 完成从objectto的转换之后,必须使用- 指针手动执行从toPyRectangle的最后一步:PyRectangleRectanglec_rect
...
def __cinit__(self, PyRectangle rect0, PyRectangle rect1):
self.c_group2 = Group2(rect0.c_rect, rect1.c_rect)
cpdef-function的规则类似,因为它们可以从纯 Python 中调用。在“早期绑定”仅适用于该用Cython可以自动从/ coverted到Python对象类型。
不出所料,唯一可以在其签名中包含 C++ 类的cdef函数是-functions。
- 1 回答
- 0 关注
- 162 浏览
添加回答
举报