如何获取装饰器所包裹的函数?

4 投票
5 回答
714 浏览
提问于 2025-04-15 14:57

假设我有

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

现在,func这个对象是someDecorator的一个实例。有没有什么方法可以访问它内部持有的函数,也就是说,像func.getInnerFunction()这样的方式。

比如说,如果我需要获取func()的文档字符串。

5 个回答

1

你是在找类似这样的东西吗?

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

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


>>> test()
abc

你把函数明确地传给了装饰器,当然可以访问它。

2

SilentGhost和sri给出了一些部分的答案,关于如何处理这个问题。但是总体来说,答案是否定的:没有办法从一个被装饰的函数中拿到“被包裹”的那个函数,因为装饰器并没有规定一定要把函数包裹起来。它可能返回了一个完全不相关的函数,而你原来的那个函数的引用可能已经被垃圾回收了。

4

可以看看 functools.wraps:http://docs.python.org/library/functools.html。这个装饰器可以获取原始函数的名称和文档字符串。你可以这样使用它:

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

撰写回答