如何获取装饰器所包裹的函数?
假设我有
@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():
....