1 回答

TA貢獻1772條經(jīng)驗 獲得超6個贊
您應(yīng)該PyRectangle在def-functions的簽名中以及PyRectangle.c_rect在將矩形傳遞給 C++-functions 時使用。
這意味著您的代碼應(yīng)該是:
cdef class PyGroup2:
...
def __cinit__(self, PyRectangle rect0, PyRectangle rect1):
self.c_group2 = Group2(rect0.c_rect, rect1.c_rect)
請繼續(xù)閱讀以獲取更詳細的解釋。
傳遞給def-functions 的所有參數(shù)都是 Python 對象(即objectCython 說法中的類型),畢竟這些函數(shù)將從純 Python 中調(diào)用,而純 Python 只知道 Python 對象。
但是,您可以添加一些語法糖并在def- 函數(shù)的簽名中使用“后期綁定” ,例如,而不是
def do_something(n):
...
用
def do_something(int n):
...
在幕后,Cython 會將此代碼轉(zhuǎn)換為類似以下內(nèi)容:
def do_something(n_):
cdef int n = n_ # conversion to C-int
...
這種自動轉(zhuǎn)換對于像int或這樣的內(nèi)置類型是可能的double,因為 Python-C-API 中有這些轉(zhuǎn)換的功能(即PyLong_AsLong, PyFloat_AsDouble)。Cython 還處理錯誤檢查,因此您不應(yīng)手動進行這些轉(zhuǎn)換。
但是,對于像您的Rectangle-class 這樣的用戶定義類型/類,這種自動轉(zhuǎn)換是不可能的 - Cython 只能自動轉(zhuǎn)換為cdef-classes/extensions,即PyRectangle,因此PyRectangle應(yīng)該在簽名中使用:
cdef class PyGroup2:
...
def __cinit__(self, PyRectangle rect0, PyRectangle rect1):
...
在 Cython 完成從objectto的轉(zhuǎn)換之后,必須使用- 指針手動執(zhí)行從toPyRectangle的最后一步:PyRectangleRectanglec_rect
...
def __cinit__(self, PyRectangle rect0, PyRectangle rect1):
self.c_group2 = Group2(rect0.c_rect, rect1.c_rect)
cpdef-function的規(guī)則類似,因為它們可以從純 Python 中調(diào)用。在“早期綁定”僅適用于該用Cython可以自動從/ coverted到Python對象類型。
不出所料,唯一可以在其簽名中包含 C++ 類的cdef函數(shù)是-functions。
- 1 回答
- 0 關(guān)注
- 183 瀏覽
添加回答
舉報