我正在尝试从另一个扩展中转发声明一个类。本质上,我有一个文件 src/myClass/myClass.pxd
(和一个关联的 .pyx 文件),其中包含 cdef class myClass
的定义。现在在另一个文件 src/myClass/myHelper.pxd
(带有关联的 .pyx 文件)中,我想转发声明 myClass
类型,以便我可以在 myClass
中有一个 cdef class myHelper
类型的字段.我需要将它向前声明,不能简单地 cimport
它,因为 myClass
指回 myHelper
。问题是,当我转发声明 myClass
为 cdef class myClass
时,cythonize
抱怨该类没有定义,即使它只是在另一个地方。有没有办法解决这个问题?
我不确定 cythonize
如何在内部处理这个问题,但如果类字段是指针,应该没问题。
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
答案 0 :(得分:2)
我认为您根本不需要转发声明它。我可以得到一个使用循环 cimport 的简单示例:
df = df[["A", "Aratio", "B", "Bratio", "C", "Cratio", "total"]]
# 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
这对我来说编译和导入很好。我认为前向声明造成的混乱比解决的要多。