バージョン 2.5 で 新たに追加 された仕様です。
モジュール functools は高階関数、 つまり関数に対する関数、あるいは他の関数を返す関数、のためのものです。 一般に、どんな呼び出し可能オブジェクトでもこのモジュールの目的には関数として扱えます。
モジュール functools では以下の関数を定義します。
| func[,*args][, **keywords]) |
def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords.copy()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
関数 partial は、 関数の引数と/かキーワードの一部を「凍結」した部分適用として使われ、 簡素化された引数形式をもった新たなオブジェクトを作り出します。 例えば、partial を使って base 引数のデフォルトが 2 である int 関数のように振る舞う呼び出し可能オブジェクトを作ることができます。
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18
| wrapper, wrapped[, assigned][, updated]) |
この関数は主に関数を包んで wrapper を返すデコレータ関数の中で使われるよう意図されています。 もし wrapper 関数がアップデートされないとすると、 返される関数のメタデータは元の関数の定義ではなく wrapper 関数の定義を反映してしまい、 これは典型的に役立たずです。
| wrapped[, assigned][, updated]) |
partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)
を関数デコレータとして呼び出す便宜関数です。
>>> def my_decorator(f):
... @wraps(f)
... def wrapper(*args, **kwds):
... print 'Calling decorated function'
... return f(*args, **kwds)
... return wrapper
...
>>> @my_decorator
... def example():
... print 'Called example function'
...
>>> example()
Calling decorated function
Called example function
>>> example.__name__
'example'
'wrapper' となっているところです。