Cython class 来自其他扩展的前向声明

Cython class forward declaration from other extension

我正在尝试从另一个扩展转发声明一个 class。本质上,我有一个文件 src/myClass/myClass.pxd(和一个关联的 .pyx 文件),其中包含 cdef class myClass 的定义。现在在另一个文件 src/myClass/myHelper.pxd(与关联的 .pyx 文件)中,我想转发声明 myClass 类型,以便我可以在 cdef class myHelper 中有一个 myClass 类型的字段.我需要它被前向声明,不能简单地 cimport 因为 myClass 指回 myHelper。问题是当我将 myClass 转发声明为 cdef class myClass 时,cythonize 抱怨 class 没有定义,即使它只是在另一个地方。有解决办法吗?

我不确定 cythonize 如何在内部处理这个问题,但如果 class 字段是指针,应该没问题。

src/myClass/myClass.pxd:

from src.myClass.myHelper cimport myHelper

cdef class myClass:
    cdef:
        myHelper helper

    # other definitions...

src/myClass/myHelper.pxd:

cdef class myClass

cdef class myHelper:
    cdef:
        myClass helper

    # other definitions, not using the actual structure of myClass

我认为您根本不需要转发声明它。我可以获得一个使用循环导入的简单示例:

# A.pxd
from B cimport B

cdef class A:
    cdef B binst
# B.pxd
from A cimport A

cdef class B:
    cdef A ainst
# A.pyx
cdef class A:
    pass
cdef class B:
    pass

这对我来说编译和导入都很好。我认为前向声明造成的混乱比解决的更多。