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: 178

Filed under:
|
|
|

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

Related posts about python

Related posts about function