[ Python2.5 ] 2.5 で導入されたカリー化
Python2.5 で関数言語での「カリー化」にあたる機能が追加されているみたい。
関数を呼び出すときには引数を渡すけど、引数が複数あるとき、 Python2.4 まではそのうちのいくつかを渡して残りは待っていてね ということはできなかった。実際にやってみると次のように 例外が発生してしまう。
Python 2.4.3 (#69, Mar 29 2006, 17:35:34)
>>> adding = lambda x, y: x + y
>>> adding( 1 )
Traceback (most recent call last):
File "", line 1, in ?
TypeError: () takes exactly 2 arguments (1 given)
その関数を呼ぶためには引数がきっちり2個必要だよ、というわけだ。 もちろん、closure を使えば「次の引数ができるまでちょっと待っててね」的なことはできる。
Python 2.4.3 (#69, Mar 29 2006, 17:35:34)
>>> def step1( x ):
... def step2( y ):
... return x + y
... return step2
...
>>> adding = step1( 1 )
>>> adding( 2 )
3
できるんだけど、この場合、つまり1つの処理を無理やり2つに分けるよりは、 カリー化する方法があればもっと簡単にシンプルに書ける。 ということで Python2.5 で導入されたのが functools モジュールの partial() 関数。 これを使うと次のように書ける。
Python 2.5 (r25:51908, Sep 19 2006, 09:52:17)
>>> import functools
>>> adding = functools.partial( (lambda x, y: x + y), 1 )
>>> adding( 2 )
3
関数に渡す引数が全部そろうまでリストに貯めたりとか、 全部揃うまで待たせるために closure を使うよりは partial() したほうがなんとなくいい気がする。
closure を使った方がいい場合もあるのだろうけど、 それは context で判断しよう。
まとめ
functools.partial() をつかうと関数の部分適用
( カリー化(?)。引数が揃うまで待っててね ) ができる。
| 固定リンク
この記事へのコメントは終了しました。
コメント