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.)
2 comments