Welcome, guest | Sign In | My Account | Store | Cart
CO_VARARGS = 0x0004
CO_VARKEYWORDS = 0x0008

class Curry:
   def __init__(self, f):
       self.hasv = f.func_code.co_flags & CO_VARARGS
       self.hask = f.func_code.co_flags & CO_VARKEYWORDS
       self.defaults = f.func_defaults or ()
       self.defnum = len(self.defaults)
       self.f = f
       self.argnum = f.func_code.co_argcount
       self._reset()
   def __call__(self, *a, **k):
       if k and not self.hask:
          raise TypeError, "%s got unexpected keyword argument '%s'" %\ 
                   (self.f.__name__, k.popitem()[0])
       kargs = self.kargs
       args = self.args
       kargs.update(k)
       totlen = len(args) + len(a)
       if totlen > self.argnum:
          if not self.hasv:
             raise TypeError, "%s takes exactly %d argument%c (%d given)" %                (self.f.__name__, self.argnum, ['s',''][self.argnum==1], totlen)
          args += a
          self._reset()
          return self.f(*args, **kargs)
       if totlen >= self.argnum - self.defnum:
          num_defaults = totlen - defnum
          args += a + self.defaults[defnum-num_defaults:]
          self._reset()
          return self.f(*args, **kargs)
       self.args += a
       return self
   def _reset(self):
       self.args, self.kargs = (), {}

History