質問

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 もう。しかし、予想どおりにドキュストリング(およびヘルプ)を取得するための素晴らしい解決策は何ですか?

役に立ちましたか?

解決

使用する 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.

他のヒント

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top