元の関数をラップするデコレータを使用した場合、関数名や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