Python装饰器处理docstrings

Python decorator handling docstrings

我在装饰师使用docstring时遇到问题。举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
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的docstring,它显示:

1
2
3
Help on function _decorator in module __main__:

_decorator()

没有装饰器,帮助是正确的:

1
2
3
4
Help on function foo in module __main__:

foo()
    the magic foo function

我知道,函数foo是由修饰器包装的,因此函数对象不再是函数foo。但是,怎样才能像预期的那样获得docstring(和帮助)?


使用functools.wraps()更新装饰器的属性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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的标准库文档。


我找到了一个解决方案,但不知道它是否真的很好:

1
2
3
4
5
6
7
def decorator(f):
    def _decorator():
        print 'decorator active'
        f()
    _decorator.__name__=f.__name__
    _decorator.__doc__=f.__doc__
    return _decorator

_decorator.__name__=f.__name__的部分似乎有点可怕…你怎么认为?


看看functools.wraps:http://docs.python.org/library/functools.html