motam79 motam79 - 3 months ago 18
Python Question

python partial with keyword arguments

I have a function that takes 3 keyword parameters. It has default values for x and y and I would like to call the function for different values of z using map. When I run the code below I get the following error:


foo() got multiple values for keyword argument 'x'


def foo(x =1, y = 2, z = 3):
print 'x:%d, y:%d, z:%d'%(x, y, z)


if __name__ == '__main__':
f1 = functools.partial(foo, x= 0, y = -6)
zz = range(10)
res = map(f1, zz)


Is there a Pythonic way to solve this problem?

Answer

map(f1, zz) tries to call the function f1 on every element in zz, but it doesn't know with which arguments to do it. partial redefined foo with x=0 but map will try to reassign x because it uses positional arguments.

To counter this you can either use a simple list comprehension as in @mic4ael's answer, or define a lambda inside the map:

res = map(lambda z: f1(z=z), zz)

Another solution would be to change the order of the arguments in the function's signature:

def foo(z=3, x=1, y=2):