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

キーワード引数なら指定しなおせるのもできてるヽ(≧∀≦)ノ

満足(´¬`)