有没有办法获得装饰者包裹的功能?

时间:2009-10-09 17:51:56

标签: python function nested decorator

假设我有

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

现在,对象funcsomeDecorator的实例。有没有办法可以访问它所拥有的函数,即func.getInnerFunction()

例如,如果我需要检索func()的文档字符串。

5 个答案:

答案 0 :(得分:4)

请参阅functools.wraps:http://docs.python.org/library/functools.html。装饰器获取原始函数的名称和doc字符串。你这样使用它:

def decorator(f):
    @functools.wraps(f)
    def wrapper():
        ....

答案 1 :(得分:2)

SilentGhost和sri对如何处理这个问题有部分答案。但一般的答案是否定的:没有办法从装饰函数中获取“包装”函数,因为没有要求装饰器首先包装函数。它可能已经返回了一个完全不相关的函数,并且对原始文件的任何引用都可能已被垃圾收集。

答案 2 :(得分:1)

你在寻找这些方面的东西吗?

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

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


>>> test()
abc

您将函数显式传递给装饰器,当然您可以访问它。

答案 3 :(得分: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

答案 4 :(得分:0)

您可以尝试使用undecorated library

使用您的示例func,您只需执行此操作即可返回原始函数:

undecorated(func)