Python装饰器处理docstrings

时间:2009-11-23 12:24:39

标签: python decorator docstring

我在使用带有装饰器的文档字符串时遇到问题。给出以下示例:

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。但是,按预期获得文档字符串(和帮助)有什么好的解决方案?

3 个答案:

答案 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)