ElfsЯUs ElfsЯUs - 4 months ago 33
Python Question

Currying decorator in python

I am trying to write a currying decorator in python, and I think I've got the general idea down, but still got some cases that aren't working right...

def curry(fun):

cache = []
numargs = fun.func_code.co_argcount

def new_fun(*args, **kargs):
print args
print kargs
cache.extend(list(args))

if len(cache) >= numargs: # easier to do it explicitly, then with exceptions

temp = []
for _ in xrange(numargs):
temp.append(cache.pop())
fun(*temp)

return new_fun


@curry
def myfun(a,b):
print a,b


While for the following case this works fine:

myfun(5)
myfun(5)


For the following case it fails:

myfun(6)(7)


Any pointers on how to correctly do this would be highly appreciated!

Thanks!

Answer

The below implementation is naive, google for "currying python" for more accurate examples.

def curry(x, argc=None):
    if argc is None:
        argc = x.func_code.co_argcount
    def p(*a):
        if len(a) == argc:
            return x(*a)
        def q(*b):
            return x(*(a + b))
        return curry(q, argc - len(a))
    return p

@curry
def myfun(a,b,c):
    print '%d-%d-%d' % (a,b,c)



myfun(11,22,33)
myfun(44,55)(66)
myfun(77)(88)(99)
Comments