带有关键字参数的python部分

mot*_*m79 4 python partial

我有一个带有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)
Run Code Online (Sandbox Code Playgroud)

有没有解决该问题的Python方法?

Dee*_*ace 5

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

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

res = map(lambda z: f1(z=z), zz)
Run Code Online (Sandbox Code Playgroud)

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

def foo(z=3, x=1, y=2):
Run Code Online (Sandbox Code Playgroud)

  • 我的意思是它的行为不像一个根本没有固定参数的函数,这似乎是partial 的全部要点。我们并不是试图为参数设置新的“默认值”,它应该被修复并从图片中删除。Map 不必担心这一点,因为它甚至不应该知道“x”或“y”曾经存在过。它应该只看到一个以“z”作为唯一参数的函数。 (4认同)
  • 这难道不是‘偏’的严重缺陷吗?如果输出函数的行为不像函数应有的那样,那有什么好处呢?我希望它应该表现为一个只有一个位置/关键字参数的函数。 (2认同)