Pythonで単純な機能追加を行うためにカリングを使用しようとしています。私はこのカレーデコレータhereを見つけました。任意の数の変数でPythonをカリングする
def curry(func):
def curried(*args, **kwargs):
if len(args) + len(kwargs) >= func.__code__.co_argcount:
return func(*args, **kwargs)
return (lambda *args2, **kwargs2:
curried(*(args + args2), **dict(kwargs, **kwargs2)))
return curried
@curry
def foo(a, b, c):
return a + b + c
私はいくつかの簡単なカリー化を行うことができますので、今、これは素晴らしいです:
>>> foo(1)(2, 3)
6
>>> foo(1)(2)(3)
6
しかし、正確に三つの変数のために、この唯一の作品を。どのように多くの変数を受け入れ、結果をカレーすることができるように関数fooを書くには?私は* argsを使う単純な解決策を試しましたが、うまくいかなかったのです。
編集:私は答えを見てきましたが、それでも、以下のように実行することができます関数を記述する方法を見つけ出すことはできません。
>>> foo(1)(2, 3)
6
>>> foo(1)(2)(3)
6
>>> foo(1)(2)
3
>>> foo(1)(2)(3)(4)
10
@curry def foo(* arg): return sum(arg)。これを試してください –
どのようにカリングはいつ止めるべきかを知っていますか? 'foo'が任意の数の引数を取ることができる場合、' foo(1,2,3) 'はそれを呼び出すか、それともカレー化しますか? –
私はsum(args)を試しました。最初の呼び出しの後では機能しません.fooはintになり、再び呼び出すことができないので、本質的にcurryingは機能しません。 – Kevin