2009-10-09 101 views
3

假設我有有沒有辦法讓裝飾者包裝的功能?

@someDecorator 
def func(): 
    '''this function does something''' 
    print 1 

現在,對象funcsomeDecorator一個實例。有什麼方法可以訪問它擁有的功能,即類似於func.getInnerFunction()

例如,如果我需要檢索文檔字符串func()

回答

1

您是否在尋找這方面的內容?

>>> def dec(f): 
    def inner(): 
     print(f.__doc__) 
    return inner 

>>> @dec 
def test(): 
    """abc""" 
    print(1) 


>>> test() 
abc 

你明確地傳遞函數來裝飾,當然你也可以訪問它。

2

SilentGhost和sri對於如何處理這個問題有部分的答案。但是一般的答案是否定的:沒有辦法從裝飾函數中獲取「包裝」函數,因爲沒有要求裝飾器首先包裝函數。它可能已經完全返回了一個完全不相關的函數,並且任何對原文的引用可能已經被垃圾收集。

0

您可以將包裝的函數的內部函數

In [1]: def wrapper(f): 
    ...:  def inner(): 
    ...:   print "inner" 
    ...:  inner._orig = f 
    ...:  return inner 
    ...: 

In [2]: @wrapper 
    ...: def foo(): 
    ...:  print "foo" 
    ...:  
    ...:  

In [3]: foo() 
inner 

In [4]: foo._orig() 
foo 
0

您可以嘗試使用undecorated library

你的榜樣func,你可以簡單地做回原來的功能:

undecorated(func) 
相關問題