2015-01-16 94 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是什么,我假设有一个内置的解除分配包装,我只是不知道。

相关问题