Python装饰器处理文档字符串
我在使用装饰器和文档字符串(docstrings)时遇到了一个问题。给你看个例子:
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
了。那么,有什么好的办法可以让文档字符串(和帮助信息)显示得像我预期的那样吗?
4 个回答
4
看看这个 functools.wraps
: http://docs.python.org/library/functools.html
22
我找到了一种解决办法,但不确定这是否真的好:
def decorator(f):
def _decorator():
print 'decorator active'
f()
_decorator.__name__=f.__name__
_decorator.__doc__=f.__doc__
return _decorator
那部分用到 _decorator.__name__=f.__name__
的代码看起来有点丑陋……你觉得呢?
107
使用 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
的更多信息。