Python の部分関数は、functools モジュールを介してユーザーによって呼び出されます。

部分関数(部分適用)

関数を実行する際は、必要なすべての引数を付けて呼び出さなければなりません。しかし、引数が関数の呼び出し前に事前に分かることもあります。このような場合は、1つ以上の引数を事前に設定できるため、関数をより少ない引数で呼び出せます。

部分関数とは、対象となる関数を partial() 関数の最初の引数として受け渡し、元の関数の各引数を partial() 関数の後続の引数として順番に渡します。ただし、キーワード引数を使用する場合は除きます。

言葉による説明だけでは部分関数の使い方が理解できないかもしれませんので、よくある例を挙げて説明します。この例では、整数 100 について、異なる数 m に対する 100 % m の余りを求める剰余関数を実装します。

from functools import partial
 
def mod( n, m ):
  return n % m
 
mod_by_100 = partial( mod, 100 )
 
print mod( 100, 7 )  # 2
print mod_by_100( 7 )  # 2

これまでに見た例では、一般的に足し算や掛け算が使われるため、部分関数の引数の位置関係を実感できず、partial の2番目の引数が元の関数の2番目の引数でもあるという誤解を招きがちです。そこで、ここでは mod を使って説明します。

一方、キーワード引数を使う場合は、元の関数の引数の位置や個数に従う必要がなくなります。次に、異なる基数変換を行う方法を示す別の例を見てみましょう。

from functools import partial
 
bin2dec = partial( int, base=2 )
print bin2dec( '0b10001' )  # 17
print bin2dec( '10001' )  # 17
 
hex2dec = partial( int, base=16 )
print hex2dec( '0x67' )  # 103
print hex2dec( '67' )  # 103

部分関数のこれらの応用は一見単純に見えますが、その用途は非常に広く、DRY原則をうまく実行し、プログラミングのコストを節約できます。

Pythoner から転載

本文リンク先: http://www.pythoner.com/54.html