## thunkurry: a Python decorator for partial application

Here is a decorator which allows you to curry named and/or positional arguments as many times as you like. The underlying function is finally called when the decorated function is called as a thunk (meaning, without any arguments).

def thunkurry(f_, *t_, **d_): """Currying thunk decorator Example usage: >>> prod = lambda *a: reduce(operator.mul, a) >>> sum_ = lambda *a: sum(a) >>> thunkurry(prod)(2)(3)(4)() == prod(2,3,4) == 24 True >>> thunkurry(lambda a,b,c:a+b+c)(c=1)(2)(c=3)(4)() 9 >>> a = thunkurry(sum_) >>> a = a(1)(2)(3); a() 6 >>> a = a(1)(2)(3); a() 12 """ def fn(*T_, **D_): return f_(*t_, **d_) if not (T_ or D_) \ else thunkurry(f_, *t_ + T_, **dict(d_.items() + D_.items())) fn.__doc__ = f_.__doc__ return fn

I’ve mostly found this useful as a class decorator.

(Note: the Talk:Currying page on wikipedia has some discussion about the terms *currying* vs. *partial application*; I’m using the terms interchangeably here and am not sure if that is wrong.)

2comments