如何在 cython 中检查 python 对象的类型?
我的 Cython 扩展E编译到E.pyd一个模块内M。
我正在尝试检查class ACython extension 中python 参数的类型E。
cdef class A:
def foo(self, bar):
if bar is A:
print("ok")
else
print("invalid")
Run Code Online (Sandbox Code Playgroud)
问题是当我去使用 python 的扩展时,
from M import E
a = A()
b = A()
a.foo(b)
Run Code Online (Sandbox Code Playgroud)
bar 不是 A,而是M.E.A当我使用type(b)Python 时
我if bar is M.E.A:在 Cython 中尝试过,但编译器抱怨undeclared name not builtin: M,因为 Cython 不知道该模块。
在 Cython 和 Python 中is都是对象标识。它不用于检查类型。
你应该写:
if isinstance(bar, A):
...
Run Code Online (Sandbox Code Playgroud)
如果您想检查是否bar属于类型A或其任何子类型
或者
if type(bar) is A:
...
Run Code Online (Sandbox Code Playgroud)
如果要检查baris 正是 type A。
或者Cython通过以下方式提供类型检查:
def foo(self, A bar):
Run Code Online (Sandbox Code Playgroud)
这允许用户通过也None意味着没有对象。如果要排除None写入:
def foo(self, A bar not None):
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2552 次 |
| 最近记录: |