在Cython中共享扩展类型以进行静态类型

时间:2013-07-18 22:26:54

标签: python cython

我将Python类转换为.pyx文件中的扩展类型。我可以在另一个Cython模块中创建这个对象,但我不能用它做静态类型

这是我班级的一部分:

cdef class PatternTree:

    cdef public PatternTree previous
    cdef public PatternTree next
    cdef public PatternTree parent
    cdef public list children

    cdef public int type
    cdef public unicode name
    cdef public dict attributes
    cdef public list categories
    cdef public unicode output

    def __init__(self, name, parent=None, nodeType=XML):
        # Some code

    cpdef int isExpressions(self):
        # Some code

    cpdef MatchResult isMatch(self, PatternTree other):
        # Some code

    # More functions...

我已经尝试过使用.pxd文件来声明它,但它在我的所有函数上都说“C方法[某些函数]已声明但未定义”。我也尝试在我的实现的函数中剥离C的东西,使它像一个增强类,但这也不起作用。

这是我的.pxd:

cdef class PatternTree:
    cdef public PatternTree previous
    cdef public PatternTree next
    cdef public PatternTree parent
    cdef public list children

    cdef public int type
    cdef public unicode name
    cdef public dict attributes
    cdef public list categories
    cdef public unicode output

    # Functions
    cpdef int isExpressions(self)
    cpdef MatchResult isMatch(self, PatternTree other)

感谢您的帮助!

1 个答案:

答案 0 :(得分:11)

我找到了解决方法。这是解决方案:

在.pyx中:

cdef class PatternTree:

    # NO ATTRIBUTE DECLARATIONS!

    def __init__(self, name, parent=None, nodeType=XML):
        # Some code

    cpdef int isExpressions(self):
        # Some code

    cpdef MatchResult isMatch(self, PatternTree other):
        # More code

在.pxd:

cdef class PatternTree:
    cdef public PatternTree previous
    cdef public PatternTree next
    cdef public PatternTree parent
    cdef public list children

    cdef public int type
    cdef public unicode name
    cdef public dict attributes
    cdef public list categories
    cdef public unicode output

    # Functions
    cpdef int isExpressions(self)
    cpdef MatchResult isMatch(self, PatternTree other)

在任何Cython模块(.pyx)中,我想将它用于:

cimport pattern_tree
from pattern_tree cimport PatternTree

最后一句警告:Cython 不支持相对导入。这意味着您必须提供相对于正在执行的主文件的整个模块路径。

希望这可以帮助那些人。