我在使用带有装饰器的文档字符串时遇到问题。给出以下示例:
def decorator(f):
def _decorator():
print 'decorator active'
f()
return _decorator
@decorator
def foo():
'''the magic foo function'''
print 'this is function foo'
help(foo)
现在帮助没有按预期显示foo
的文档字符串,它显示:
Help on function _decorator in module __main__:
_decorator()
没有装饰器,帮助是正确的:
Help on function foo in module __main__:
foo()
the magic foo function
我知道,函数foo
由装饰器包装,因此函数对象不再是函数foo
。但是,按预期获得文档字符串(和帮助)有什么好的解决方案?
答案 0 :(得分:75)
使用functools.wraps()
更新装饰器的属性:
from functools import wraps
def decorator(f):
@wraps(f)
def _decorator():
print 'decorator active'
f()
return _decorator
@decorator
def foo():
'''the magic foo function'''
print 'this is function foo'
help(foo)
另请参阅functools
的{{3}}。
答案 1 :(得分:15)
我找到了一个解决方案,但不知道它是否真的很好:
def decorator(f):
def _decorator():
print 'decorator active'
f()
_decorator.__name__=f.__name__
_decorator.__doc__=f.__doc__
return _decorator
_decorator.__name__=f.__name__
的部分看起来有点可怕......你怎么看?
答案 2 :(得分:2)
查看functools.wraps
:http://docs.python.org/library/functools.html