2016-08-16 87 views
0

我有一个函数,需要3个关键字参数。它具有x和y的默认值,我想用map来调用z的不同值。当我运行下面我收到以下错误代码:python部分与关键字参数

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) 

有没有办法解决这个问题的一个Python化的方式?

+0

当发布有关抛出错误的代码的问题时,请包含Traceback。 – wwii

+0

您是否会为参数的不同组合创建部分,而不是您在示例中显示的部分?您是否正在寻找一种通用的解决方案,您不必在部分调用签名中指定* missing * arguments的名称? – wwii

回答

2

map(f1, zz)试图调用函数f1每个元素在zz,但它不知道与参数做到这一点。 partial重新定义foox=0map将尝试重新分配x,因为它使用位置参数。

为了解决这个问题,你可以使用一个简单的列表理解为@mic4ael's答案,或者定义map内的λ:

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

另一种解决方案是改变函数的签名的参数的顺序:

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

当试图在内部调用res = map(f1, zz)时,它实际上看起来像[f1(i) for i in range(10)。正如你所看到的,你只需要一个位置参数就可以调用f1函数(在这种情况下为f1(x=i))。一种可能的解决办法是做这样的事情

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