Python装饰器处理文档字符串

67 投票
4 回答
23995 浏览
提问于 2025-04-15 16:17

我在使用装饰器和文档字符串(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.wrapshttp://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 的更多信息。

撰写回答