by shigemk2

当面は技術的なことしか書かない

エキスパートPythonプログラミング デコレータ その2


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