我想从另一个文件调用一个文件中定义的 cdef 函数。我不想将 cdef 函数更改为 cpdef,但我愿意更改第二个文件。
文件1参数.pyx
cdef class Parameters:
cdef int myVal
def __init__(self):
self.myVal = 0
cdef change_myVal(self):
self.myVal = 3
文件2模型.pyx
from parameters import Parameters
cpdef single_run():
parameters = Parameters()
parameters.change_myVal()
我得到的错误是:“AttributeError:'parameters.Parameters'对象没有属性'change_myVal'”
我遇到了类似的问题,我修复它的方法(这可能是一种黑客)是在类定义之外添加一个接受类实例的函数,并单独添加该函数。无论出于何种原因,仅对类(通过
cimport
)进行 cimport
操作并没有以我可以从另一个文件访问 cdef 方法的方式进行操作。所以在 file1parameters.pyx 中我们有:cimport_from_pyx
在 File2 model.pyx 中,我们有
cdef class Parameters:
def int myVal
def __init__(self):
self.myVal = 0
cdef change_myVal(self):
self.myVal = 3
cdef void change_PVal(Parameters P) noexcept nogil:
P.change_myVal()
在这里,我们 Python 导入了
from parameters import Parameters
from parameters cimport Parameters, change_PVal
cpdef single_run():
cdef Parameters parameters = Parameters()
change_PVal(parameters)
类,但我们还引入了
Parameters
参数,以便将其识别为 Cython 扩展。然后,我不是直接使用 cimport
,而是通过作为单独函数导出的 change_myVal
函数来访问它。由于某种原因,当调用 change_PVal
ed 类的方法引发 cimport
时,这会起作用。也许有人可以解释为什么会发生这种情况,至少在使用 AttributeError
编译器选项时。