元の関数をラップするデコレータを使用した場合、関数名やdocstringがデコレータで定義したものに
置き換わってしまう。
>>> def mydecorator(function): ... def _mydecorator(*args, **kw): ... res = function(*args, **kw) ... return res ... return _mydecorator ... >>> @mydecorator ... def my_function(arg): ... """my docstring""" ... return arg ... >>> my_function.func_name '_mydecorator' >>> my_function.func_doc >>> help(my_function) Help on function _mydecorator in module __main__: _mydecorator(*args, **kw)
元の関数を保持する場合はfunctoolsモジュールのwrapsデコレータを関数の前につけるとよい。
from functools import wraps >>> def mydecorator(function): ... @wraps(function) ... def _mydecorator(*args, **kw): ... return function(*args, **kw) ... return _mydecorator ... >>> @mydecorator ... def my_function(arg): ... """my docstring""" ... return arg ... >>> my_function.func_name 'my_function' >>> my_function.func_doc 'my docstring' >>> help(my_function) Help on function my_function in module __main__: my_function(*args, **kw) my docstring