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