首页 > 解决方案 > Cython 共享扩展类型:类

问题描述

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

据我了解,我们不能直接从 Python 调用 Cython 对象,所以我打算让TEST类作为包装器工作,它可以调用更快的 Cython 类。
但是,我发现一个类对象.pyx不能cdef在同一个文件中调用 Cythonized 类中的函数,所以cdef class CYTEST有另一个包装函数def func(),这对我来说看起来效率低下。 (我原来的问题中的这一段原来是错误的)

我发现我们可以在文件中声明对象(例如intlistobject.pxd,并且我们可以从文件中定义的 Python 类中读取 Cython 类中的对象.pyx(在下面的示例中,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

官方文档没有我的案例的例子。

标签: pythonpython-3.xcython

解决方案


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

问题是它不知道那self.main.cyobj2是 a CYTEST,因此不可能调用Cyfunc.

最简单的选择是强制转换它:

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

TypeError(如果演员表失败,你会得到一个)。

第二种选择是创建Cyfunc一个cpdef函数,以便可以在不知道类型的情况下以正常的 Python 方式调用它。

第三种选择可能是制作MAINa cdef classtoo,然后指定 and 的类型cyobj1cyobj2以及CYTEST.main. 但是,这可能会导致循环依赖问题,所以我不完全确定这是可能的。


推荐阅读