Cython - 检查对象的类型

时间:2014-03-27 16:17:44

标签: python cython

如何在cython中检查python对象的类型?

我的Cython扩展程序EE.pyd模块中编译为M

我正在尝试检查Cython扩展class A的{​​{1}}中的python参数的类型。

E

麻烦的是当我去使用python的扩展名时,

cdef class A:
    def foo(self, bar):
        if bar is A:
            print("ok")
        else
            print("invalid")
当我使用Python中的from M import E a = A() b = A() a.foo(b)

时,

bar不是A,而是M.E.A

我在Cython中尝试了type(b),但编译器抱怨if bar is M.E.A:,因为Cython不知道该模块。

1 个答案:

答案 0 :(得分:4)

在Cython中,因为Python is是对象标识。它不用于检查类型。

  • 你应该写:

    if isinstance(bar, A):
        ...
    

    如果您想检查barA类型还是其任何子类型

  • if type(bar) is A:
        ...
    

    如果您要检查bar是否完全属于A类型。

或者Cython通过以下方式提供类型检查:

def foo(self, A bar):

允许用户也传递None,表示没有对象。如果要排除None写:

def foo(self, A bar not None):

请参阅Cython docs on extension types