這似乎是一個應該有明顯答案的問題,但由於某種原因,我在網上找不到任何示例。使用Cython擴展模塊來包裝std :: vector - 如何編程__setitem __()方法?
我正在使用Cython在Python類中包裝C++對象的向量。我也有一個已經編碼的C++類的Cython包裝器。我可以得到幾種方法,如__len__()
,__getitem__()
和resize()
正常工作,但__setitem__()
方法給我的問題。
爲了簡單起見,我用int
s的矢量編碼了一個小例子。我想,如果我能得到這個代碼的工作,那麼我可以建立在這個,以獲得我的C++類的解決方案。
MyPyModule.pyx
# distutils: language = c++
from libcpp.vector cimport vector
from cython.operator cimport dereference as deref
cdef class MyArray:
cdef vector[int]* thisptr
def __cinit__(self):
self.thisptr = new vector[int]()
def __dealloc__(self):
del self.thisptr
def __len__(self):
return self.thisptr.size()
def __getitem__(self, size_t key):
return self.thisptr.at(key)
def resize(self, size_t newsize):
self.thisptr.resize(newsize)
def __setitem__(self, size_t key, int value):
# Attempt 1:
# self.thisptr.at(key) = value
# Attempt 2:
# cdef int* itemptr = &(self.thisptr.at(key))
# itemptr[0] = value
# Attempt 3:
# (self.thisptr)[key] = value
# Attempt 4:
self[key] = value
當我試圖嘗試使用1〜cythonize,我得到了錯誤Cannot assign to or delete this
。當我試圖嘗試2,.cpp
文件被創建,但編譯器抱怨說:
error: cannot convert ‘__Pyx_FakeReference<int>*’ to ‘int*’ in assignment
__pyx_v_itemptr = (&__pyx_t_1);
嘗試次數3,用Cython不會因爲建在Cannot assign type 'int' to 'vector[int]'
文件。 (當我用C++對象而不是int
來嘗試這種風格時,它抱怨是因爲我有一個左值的引用。)嘗試4編譯,但是當我嘗試使用它時,出現段錯誤。
Cython docs表示不支持返回一個引用作爲左值,這很好 - 但我該如何解決它,以便我可以爲我的矢量元素之一分配一個新值?
你的方法做的工作,但我有,因爲在大多數情況下指針工作,我將用C++創建對象並將其封裝在Python中使用。不過謝謝你的建議! –
然後我認爲這個鏈接可以幫助:http://docs.cython.org/src/userguide/wrapping_CPlusPlus.html#add-public-attributes –