Pythonデコレータードキュストリングの取り扱い
質問
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
所属していません StackOverflow