2014-03-27 64 views
1

如何檢查cython中的python對象的類型?Cython - 檢查對象的類型

我的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") 

麻煩的是,當我去使用從蟒蛇的延長,

from M import E 
a = A() 
b = A() 
a.foo(b) 

酒吧是不是A,而是M.E.A當我使用type(b)在Python

我已經從試圖if bar is M.E.A:在Cython中,但編譯器抱怨undeclared name not builtin: M,因爲Cython不知道該模塊。

回答

2

在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