Why doesn't functools.partial return a real function (and how to create one that does)?
        Posted  
        
            by 
                epsilon
            
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by epsilon
        
        
        
        Published on 2012-11-20T22:47:15Z
        Indexed on 
            2012/11/20
            23:00 UTC
        
        
        Read the original article
        Hit count: 234
        
So I was playing around with currying functions in Python and one of the things that I noticed was that functools.partial returns a partial object rather than an actual function. One of the things that annoyed me about this was that if I did something along the lines of:
five = partial(len, 'hello')
five('something')
then we get
TypeError: len() takes exactly 1 argument (2 given)
but what I want to happen is
TypeError: five() takes no arguments (1 given)
Is there a clean way to make it work like this? I wrote a workaround, but it's too hacky for my taste (doesn't work yet for functions with varargs):
def mypartial(f, *args):
  argcount = f.func_code.co_argcount - len(args)
  params = ''.join('a' + str(i) + ',' for i in xrange(argcount))
  code = '''
def func(f, args):
  def %s(%s):
    return f(*(args+(%s)))
  return %s
  ''' % (f.func_name, params, params, f.func_name)
  exec code in locals()
  return func(f, args)
        © Stack Overflow or respective owner