functools.partialでのカリー化について考えてみる
- 追記 2011-09-18
- この記事にあるのはカリー化ではなく部分適用の間違いです。
functools.partialというのを教えてもらったのでどういうものか試してみる(`・ω・´)
こちらも参考に
ぐぐってみるとfunctools.partialというのはPython 2.5からの新機能らしい!!ということがわかった
あらためて使ってみる
>>> f = lambda x, y: x ** y >>> f(2, 3) 8 >>> from functools import partial >>> g = partial(f, 2) >>> g(3) 8
ほぉほぉ
partialはさらにキーワード引数も指定できるらしい!!
>>> g = partial(f, x=2) >>> g(3) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: <lambda>() got multiple values for keyword argument 'x' >>>
怒られた(>_<)
>>> g(y=3) 8 >>> g = partial(f, y=3) >>> g(2) 8
(*'ω')b
元の関数の引数の順番は大事みたい
使い方はわかったから自分で作ってみるYO(>_<)
def my_partial(f, *args, **keywords): def g(*gargs, **gkeywords): real_args = list(args) real_args.extend(gargs) real_keywords = dict(keywords) real_keywords.update(gkeywords) return f(*real_args, **real_keywords) return g
これでいいかな?とりあえず実行
>>> g = my_partial(f, 2) >>> g(3) 8 >>> g = my_partial(f, x=2) >>> g(3) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 7, in g TypeError: <lambda>() got multiple values for keyword argument 'x' >>> g(y=3) 8 >>> g = my_partial(f, y=3) >>> g(x=2) 8
できてるヽ(≧∀≦)ノ
>>> g = partial(f, x=3) >>> g(x=2, y=3) 8 >>> g = my_partial(f, x=3) >>> g(x=2, y=3) 8
キーワード引数なら指定しなおせるのもできてるヽ(≧∀≦)ノ
満足(´¬`)