假設我有有沒有辦法讓裝飾者包裝的功能?
@someDecorator
def func():
'''this function does something'''
print 1
現在,對象func
是someDecorator
一個實例。有什麼方法可以訪問它擁有的功能,即類似於func.getInnerFunction()
。
例如,如果我需要檢索文檔字符串func()
。
假設我有有沒有辦法讓裝飾者包裝的功能?
@someDecorator
def func():
'''this function does something'''
print 1
現在,對象func
是someDecorator
一個實例。有什麼方法可以訪問它擁有的功能,即類似於func.getInnerFunction()
。
例如,如果我需要檢索文檔字符串func()
。
查看functools.wraps:http://docs.python.org/library/functools.html。裝飾器獲取原始函數的名稱和文檔字符串。你可以這樣使用它:
def decorator(f):
@functools.wraps(f)
def wrapper():
....
您是否在尋找這方面的內容?
>>> def dec(f):
def inner():
print(f.__doc__)
return inner
>>> @dec
def test():
"""abc"""
print(1)
>>> test()
abc
你明確地傳遞函數來裝飾,當然你也可以訪問它。
SilentGhost和sri對於如何處理這個問題有部分的答案。但是一般的答案是否定的:沒有辦法從裝飾函數中獲取「包裝」函數,因爲沒有要求裝飾器首先包裝函數。它可能已經完全返回了一個完全不相關的函數,並且任何對原文的引用可能已經被垃圾收集。
您可以將包裝的函數的內部函數
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