Island Babies

いろんなことを書きます

関数の部分適用 : functools.partial

functools

functoolspythonの組み込みモジュールで、主に高階関数を扱うモジュールです。

functools モジュールは高階関数、つまり関数に影響を及ぼしたり他の関数を返したりする関数のためのものです。一般に、どんな呼び出し可能オブジェクトでもこのモジュールの目的には関数として扱えます。

前にブログで書いたlru_cache もこのfunctoolsに含まれる関数のうちの一つです。今回はモジュールに含まれる partial という関数について。

partial

partial は関数とその引数の一部を受け取り、一部の引数のみを適用させた状態のオブジェクトを返します。 こういうのを関数型言語なんかでは部分適用と呼ぶことが多いと思います。カリー化・アンカリー化なんかの流れで出てくる印象があります。 一部の引数のみを適用させた〜というのは、例えば次のようにかけるということです。

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo('10010')
18

partial(int, base=2)の部分で、int関数にbase=2というキーワード引数を渡して、それを固定したオブジェクトを計算しています。 そして、そのオブジェクトを関数のように扱い、basetwo('10010')の値を計算します。
basetwo('10010')int('10010', base=2)と等価です。 当然ですが、キーワード引数以外でも可能です。例えば、

>>> from operator import add
>>> from functools import partial
>>> add_10 = partial(add, 10)
>>> add_10(2)
12

addは二つの変数を受け取り、その和を返す関数です。partial(add, 10)により、そのうちの一つを10で固定した関数を計算しています。 10を足すという処理がたくさん出てくる時にはadd_10 とだけ書けばいいということですね!

ちょっとうまい例が思いつかないですが、一般的な形で書いておいた関数を、よりシンプルにかけるようになる、便利な関数だと思います。