有没有办法让装饰者包装的功能?

问题描述:

假设我有有没有办法让装饰者包装的功能?

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

现在,对象funcsomeDecorator一个实例。有什么方法可以访问它拥有的功能,即类似于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 

您可以尝试使用undecorated library

你的榜样func,你可以简单地做回原来的功能:

undecorated(func)