有没有办法让装饰者包装的功能?
问题描述:
假设我有有没有办法让装饰者包装的功能?
@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