如何在cython中检查python对象的类型?
我的Cython扩展程序E
在E.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不知道该模块。
答案 0 :(得分:4)
在Cython中,因为Python is
是对象标识。它不用于检查类型。
你应该写:
if isinstance(bar, A):
...
如果您想检查bar
是A
类型还是其任何子类型
或
if type(bar) is A:
...
如果您要检查bar
是否完全属于A
类型。
或者Cython
通过以下方式提供类型检查:
def foo(self, A bar):
允许用户也传递None
,表示没有对象。如果要排除None
写:
def foo(self, A bar not None):