Cython - 检查对象类型

3 投票
1 回答
3641 浏览
提问于 2025-04-18 00:10

我该如何在Cython中检查Python对象的类型呢?

我的Cython扩展 E 编译成了一个模块 M 下的 E.pyd 文件。

我想在Cython扩展 Eclass 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的扩展类型文档

撰写回答