2013-11-09 76 views
0

獲取函數中定義的函數如果我想如下使用裝飾:通過裝飾

@getFunc('bar') 
def foo(): 
    def bar(): 
     print 'bar' 

我怎麼會做裝飾檢索名爲酒吧內的功能?

def getFunc(str) 
    def getFunc_inner(func): 
     def new(*args, **kwargs): 
      func(*args, **kwargs) 
      myFunc = ??# Get function named {str} from func 
     return new 
    return getFunc_inner 
+0

我想一個辦法是使用'inspect'和'ast'模塊。 –

+0

簡短的回答:你不能 – alko

+1

[在Python中如何獲取/設置函數(從外部)的局部變量?](http://stackoverflow.com/questions/1360721/how-to-get-get-設置局部變量的函數從外部在python) – alko

回答

0

你可以返回功能是這樣的:

from functools import wraps 
def method_decorator(fn): 
    @wraps(fn) 
    def wrapper(*args, **kwargs): 
     res = fn(*args,**kwargs) 
     if callable(res): 
      return res() 
     return res 
    return wrapper 

@method_decorator 
def foo(*args, **kwargs): 
    def baz(): 
     return "foo" 
    return baz 

@method_decorator 
def bar(*args, **kwargs): 
    return("bar") 

if __name__ == "__main__": 
    print(foo()) 
    print(bar()) 

打印:

foo 
bar 
0

裝飾器不能,不會 「檢索」 功能。裝飾器是一個函數,它接受一個函數(裝飾函數),並返回另一個函數(裝飾過程的結果)。

如果包裝函數返回它的內部函數,那麼由裝飾器創建的函數可以做它喜歡的任何東西。

給定一個函數對象,我可以通過名稱檢索該對象中定義的函數嗎?

不,因爲def語句是可執行語句。您對函數文本的靜態外觀感到困惑。在調用外部函數之前,沒有內部函數對象供您訪問。這是必要的,因爲內部函數對象關閉了外部函數的調用的變量(上下文)。或把它更簡單,在下面的代碼,這兩個功能returned1returned2有不同的功能:

def outer(x): 
    def inner(y): 
     return x+y 
    return inner 

returned1 = outer(2) 
returned2 = outer(2) 
+0

它是一個裝飾器的事實實際上在這種情況下是無關緊要的。我想適當的問題是:給定一個函數對象,我可以通過名稱檢索該對象中定義的函數嗎?我想我可以得到該函數的文本的AST,但這似乎是矯枉過正。 – grivescorbett

+0

@grivescorbett如果你想完全忽略所有的風格和設計原則,這只是無關緊要的。無論如何,你的問題的答案是,你不能。詳情請參閱我編輯的答案。 – Marcin