假设我有
@someDecorator
def func():
'''this function does something'''
print 1
现在,对象func
是someDecorator
的实例。有没有办法可以访问它所拥有的函数,即func.getInnerFunction()
。
例如,如果我需要检索func()
的文档字符串。
答案 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)