2015-01-16 54 views

回答

0

PyCapsule是有點難看,因爲你必須定義每個類的析構函數,但它的伎倆:

from cpython cimport pycapsule 

cdef const char* CAPNAME = "ExtClassName" 
cdef void del_capsule(object o): 
    cdef ExtClass* cobject = <ExtClass*>pycapsule.PyCapsule_GetPointer(o, CAPNAME) 
    del cobject 

def mk_cpp_object(): 
    return pycapsule.PyCapsule_New(cp, CAPNAME, del_capsule) 

很可能有辦法通過用C定義++「自動更」這樣做的模板製造自己的破壞者。然後,該類型可以在cython中實例化。

0

我這個打算:

cdef class AutoPtr: 
    cdef void* _ptr 
    def __cinit__(self): self._ptr = NULL 
    def __dealloc__(self): 
     if self._ptr: mem.PyMem_Free(self._ptr) # or whatever free function is relevant to your codebase 
     self._ptr = NULL 

cdef AutoPtr mkauto(void* ptr): 
    cdef AutoPtr wrapper = AutoPtr() 
    wrapper._ptr = ptr 
    return wrapper 

我認爲__cinit__力量它的參數Python對象,所以這樣的事情甚至不會編譯:

cdef class AutoPtr: 
    cdef void* _ptr 
    def __cinit__(self, void* ptr): self._ptr = ptr 
    def __dealloc__(self): pass # etc 

這裏有一個論壇的帖子爲此:https://mail.python.org/pipermail/cython-devel/2012-June/002734.html

鑑於Cython是什麼,我假設有一個內置的解除分配包裝,我只是不知道。

相關問題