带有关键字参数的python部分

问题描述 投票:4回答:3

我有一个采用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方法来解决此问题?

python partial
3个回答
5
投票

map(f1, zz)尝试在f1中的每个元素上调用函数zz,但它不知道使用哪个参数来执行此功能。 partialfoo重新定义了x=0,但是map将尝试重新分配x,因为它使用了位置参数。

为了解决这个问题,您可以像@mic4ael's答案中那样使用简单的列表理解,也可以在map中定义一个lambda:

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

另一个解决方案是更改函数签名中参数的顺序:

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

0
投票

[在尝试内部调用res = map(f1, zz)时,实际上看起来像[f1(i) for i in range(10)。如您所见,您仅使用一个位置参数(在本例中为f1)调用f1(x=i)函数。一个可能的解决方案是做这样的事情

res = [f1(z=i) for i in range(10)]

0
投票

无需使用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

© www.soinside.com 2019 - 2024. All rights reserved.