63

デコレータで 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期待どおりの docstring がヘルプに表示されなくなりました。次のように表示されます。

Help on function _decorator in module __main__:

_decorator()

デコレータがなければ、ヘルプは正しいです:

Help on function foo in module __main__:

foo()
    the magic foo function

関数fooはデコレータによってラップされているため、関数オブジェクトはもはや関数ではありませんfoo。しかし、期待どおりにドキュメント文字列 (およびヘルプ) を取得するための優れたソリューションは何ですか?

4

4 に答える 4

102

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

于 2009-11-23T12:33:04.830 に答える
22

解決策を見つけましたが、それが本当にいいのかわかりません:

def decorator(f):
    def _decorator():
        print 'decorator active'
        f()
    _decorator.__name__=f.__name__
    _decorator.__doc__=f.__doc__
    return _decorator

の部分が_decorator.__name__=f.__name__ちょっとおぞましい…どう思いますか?

于 2009-11-23T12:31:32.057 に答える
4

見てみましょうfunctools.wraps: http://docs.python.org/library/functools.html

于 2009-11-23T12:34:52.050 に答える