« [python] うそん・・・(;´Д`) | トップページ | [ Python/.NET] IronPython で py をコンパイル »

2006/11/06

[ 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() をつかうと関数の部分適用
( カリー化(?)。引数が揃うまで待っててね ) ができる。

|

« [python] うそん・・・(;´Д`) | トップページ | [ Python/.NET] IronPython で py をコンパイル »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [ Python2.5 ] 2.5 で導入されたカリー化:

« [python] うそん・・・(;´Д`) | トップページ | [ Python/.NET] IronPython で py をコンパイル »