Cython 有类似 std::unique_ptr 的东西吗?
Does Cython have something like std::unique_ptr?
Cython 是否有办法包装 malloc 的值以便它们得到 GC?
我要这样做:
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
这里有一个论坛 post 可以达到这个目的:https://mail.python.org/pipermail/cython-devel/2012-June/002734.html
鉴于 Cython 是什么,我假设有一个我只是不知道的内置解除分配包装器。
PyCapsule 有点难看,因为你必须为每个 class 定义一个析构函数,但它确实有效:
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)
可能有一种方法可以做到这一点 'more automatically' 通过在 C++ 中定义一个模板来制造自己的析构函数。然后可以在 cython 中实例化该类型。
Cython 是否有办法包装 malloc 的值以便它们得到 GC?
我要这样做:
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
这里有一个论坛 post 可以达到这个目的:https://mail.python.org/pipermail/cython-devel/2012-June/002734.html
鉴于 Cython 是什么,我假设有一个我只是不知道的内置解除分配包装器。
PyCapsule 有点难看,因为你必须为每个 class 定义一个析构函数,但它确实有效:
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)
可能有一种方法可以做到这一点 'more automatically' 通过在 C++ 中定义一个模板来制造自己的析构函数。然后可以在 cython 中实例化该类型。