Cython - 检查对象类型
我该如何在Cython中检查Python对象的类型呢?
我的Cython扩展 E
编译成了一个模块 M
下的 E.pyd
文件。
我想在Cython扩展 E
的 class A
中检查一个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)
用 type(b)
检查时,bar 不是 A,而是 M.E.A
。
我在Cython中尝试过 if bar is M.E.A:
,但编译器报错说 undeclared name not builtin: M
,因为Cython并不知道这个模块。
1 个回答
6
在Cython和Python中,is
用来判断对象的身份,也就是说它是用来确认两个变量是不是指向同一个对象,而不是用来检查类型的。
如果你想检查
bar
是不是类型A
或者它的任何子类型,你应该写:if isinstance(bar, A): ...
或者,如果你想检查
bar
是否完全是类型A
,你可以写:if type(bar) is A: ...
另外,Cython
还提供了通过以下方式进行类型检查:
def foo(self, A bar):
这允许用户传入 None
,表示没有对象。如果你想排除 None
,可以写:
def foo(self, A bar not None):
详细信息可以查看 Cython的扩展类型文档