python partial with keyword arguments
You may obtain the equivalent result you expect without using partial
:
def foo(x =1, y = 2, z = 3):
print 'x:%d, y:%d, z:%d'%(x, y, z)
if __name__ == '__main__':
f1 = lambda z: foo(x=0, y=-6, z=z)
zz = range(10)
res = map(f1, zz)
Please see this link to have a better understanding: functools.partial wants to use a positional argument as a keyword argument
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):