Cython:扩展类型的链接列表

Posted

技术标签:

【中文标题】Cython:扩展类型的链接列表【英文标题】:Cython: Linked List of Extension Type 【发布时间】:2021-12-17 14:25:25 【问题描述】:

我需要一个使用 Cython 扩展类型的链表,即。 cdef class 但 Cython 编译器抱怨 Python 对象。

cdef class Item:
    cdef Item* prev
    cdef Item* next

Cython 错误:Pointer base type cannot be a Python object

应该是cdef struct,但是使用cdef class 有什么解决方法吗? (因为我需要方法和 OOP 约定)

【问题讨论】:

您可以使用C++ class。另请注意,Cython 包装了大部分 C++ STL,包括 std::list<T>,请参阅 here。所以真的不需要重新发明***。 【参考方案1】:

cdef class 与任何其他 Python 对象一样,通过引用存储/传递。

这意味着这里不需要使用指针:内部表示已经与指针一起存储。因此只需使用cdef Item

与任何其他 Python 对象一样,您的 Item 将被引用计数,并在不存在其他引用时自动重新分配。

【讨论】:

@Dave 直接使用cdef Item prev,next 时,我遇到了问题,因为prevnext 是在init 中创建的,并且会发生无限递归 cdef Item 真正的意思是“Item or None”) 所以你可以给它分配None 来终止无限递归

以上是关于Cython:扩展类型的链接列表的主要内容,如果未能解决你的问题,请参考以下文章

《Cython系列》4. Cython中的扩展类

通过pickle保存cython扩展

Cython 扩展模块类方法不可见/命名 提及时出错

Cython 中的 C++ 指针

如何将内置的 Cython 扩展从 PC 转移到另一台?

使用 cuda 的 cython 扩展