Cython共享扩展类型:class

时间:2018-10-16 10:28:03

标签: python python-3.x cython

我想在Cython中创建一个在Python中可读的类。目前,我的代码看起来像下面的代码(当然它们并不完全相同,但是代码的结构和组织是相同的。)

据我了解,我们无法直接从Python调用Cython对象,因此我打算使TEST类作为包装器工作,从而可以调用更快的Cython类。
但是,我发现.pyx中的类对象无法在同一文件中的Cythonized类中调用cdef函数,因此cdef class CYTEST有另一个包装函数def func(),对于我。 (我原来的问题中的这一段被证明是错误的)

我发现我们可以在int文件中声明对象(例如listobject.pxd),并且可以从以下位置读取Cython类中的对象:在.pyx文件中定义的Python类(在下面的示例中,print(self.cytest.somenum))。

我们可以对Cythonized类做类似的事情吗?在示例中,我们可以直接在Cyfunc()类中调用TEST吗?

main.py的一部分:

class MAIN:
    def __init__(self):
        cyobj1 = cyobj.CYTEST(self)
        cyobj2 = cyobj.CYTEST(self)
        cyobj1.func(3)

cyobj.pyx

cdef class CYTEST:
    cdef object main
    cdef int somenum

    def __cinit__(self, object main):
        self.main = main
        self.somenum = 5
    def func(self, int num):
        return self.Cyfunc(num)

    cdef void Cyfunc(self, int num):
        print(num)
        self.main.cyobj2.Cyfunc(num+1) # what I want to do

cyobj.pxd

cdef class CYTEST:
    cdef public object main
    cdef public int somenum
    cdef public void Cyfunc(self, int num)  # this doesn't work

Official document没有针对我的案例的示例。

1 个答案:

答案 0 :(得分:1)

self.main.cyobj2.Cyfunc(num+1) # what I want to do

问题在于,它不知道self.main.cyobj2CYTEST,因此无法调用Cyfunc

最简单的选择是将其投射:

cdef CYTEST o = self.main.cyobj2
o.Cyfunc(num+1)

(如果投射失败,您将得到TypeError)。

第二种选择是使Cyfunc成为cpdef函数,以便在不使用常规Python方式知道类型的情况下就可以调用它。

第三个选择可能是也将MAIN设为cdef class,然后指定cyobj1cyobj2以及CYTEST.main的类型。但是,这可能会导致循环依赖问题,因此我不确定这是否可能。