我有一个采用3个关键字参数的函数。它具有x和y的默认值,我想使用map来为z的不同值调用该函数。当我运行下面的代码时,出现以下错误:
foo()为关键字参数'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)
是否有Python方法来解决此问题?
map(f1, zz)
尝试在f1
中的每个元素上调用函数zz
,但它不知道使用哪个参数来执行此功能。 partial
用foo
重新定义了x=0
,但是map
将尝试重新分配x
,因为它使用了位置参数。
为了解决这个问题,您可以像@mic4ael's答案中那样使用简单的列表理解,也可以在map
中定义一个lambda:
res = map(lambda z: f1(z=z), zz)
另一个解决方案是更改函数签名中参数的顺序:
def foo(z=3, x=1, y=2):
[在尝试内部调用res = map(f1, zz)
时,实际上看起来像[f1(i) for i in range(10)
。如您所见,您仅使用一个位置参数(在本例中为f1
)调用f1(x=i)
函数。一个可能的解决方案是做这样的事情
res = [f1(z=i) for i in range(10)]
无需使用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)
[请参阅此链接以更好地理解:functools.partial wants to use a positional argument as a keyword argument