評價

2015-02-07 98 views
2

我有一個裝飾它有一個參數:評價

def supportSlice(ret_type=None): 
    ... 

,我想將它應用到一個類的成員函數,與類本身作爲參數:

class BitArray: 
    @supportSlice(ret_type=BitArray) 
    def __getitem__(self, idx): 
     ... 

但是當評估@supportSlice(ret_type=BitArray)時,我得到了一個N​​ameError,表示「name'BitArray'未定義」。看起來裝飾者沒有在我期望的環境中評估。

我的問題是何時評估一個成員函數的裝飾器?還有什麼可以實現我上面描述的目標嗎?

回答

3

裝飾者運行時(在class BitArray的身體內),名稱BitArray尚未定義!一個類的名字在之後被定義爲,其主體完成並且其元類(通常爲type)構建類對象。

最簡單的解決辦法是推遲到以後的ret_type決心...:

def supportSlice(ret_type=None): 
    def wrapper(func): 
     def wrapfunc(self, *a, **k): 
      if ret_type is None: 
       rt = type(self) 
      else: 
       rt = ret_type 
      # rest here, using rt 
     return wrapfunc 
    return wrapper 

(這是當然的簡單,如果你不需要強制ret_type不同type(self)這樣你就可以使用一個arg-less裝飾器,從而失去一個嵌套的函數級別:)。

+0

謝謝,這就是我現在要做的。 – 2015-02-07 05:09:16