所以我想了解partial
:
import functools
def f(x,y) :
print x+y
g0 = functools.partial( f, 3 )
g0(1)
4 # Works as expected
在:
g1 = functools.partial( f, y=3 )
g1(1)
4 # Works as expected
在:
g2 = functools.partial( f, x=3 )
g2(1)
TypeError: f() got multiple values for keyword argument 'x'
如果我使用TypeError
作为关键字参数,则y
会消失:
在:
g2( y=1 )
4
导致TypeError
的原因是什么?
答案 0 :(得分:32)
这与functools.partial
无关。你本质上是这样调用你的函数:
f(1, x=3)
Python首先完成位置参数,你的第一个参数是x
。然后应用关键字参数,再次提供x
。
functools.partial()
无法检测到您已将第一个位置参数作为关键字参数提供。它不会通过用y=
关键字参数替换位置参数来扩充您的调用。
混合位置和关键字参数时,必须注意不要两次使用相同的参数。
答案 1 :(得分:1)
要扩展@ Martijn-Pieters的答案,这是您可以保留第二个参数的位置性质的方法。在这里,g2的参数在位置上以y形式传递:
def f(x,y) :
print x+y
g2 = functools.partial( f, *[3] )
g2(1)
当我们尝试替换f的初始参数集时,此方法有效。我不知道如何使用partial
来替换例如只是3参数函数的第二个参数,并允许第一个和第三个在位置传递。
但是您可以使用lambda表达式来做到这一点。
答案 2 :(得分:0)
不是答案,而是后续问题(由于没有50个信誉我无法添加评论),您能否详细说明或使用简单术语,因为这里的答案超出了我的理解范围。 使用Maya中的按钮遇到类似的问题
<rule name="UF" stopProcessing="true">
<match url="([_0-9a-z-]+)" />
<action type="Redirect" url="https://example.com/?{R:1}" appendQueryString="false" />
</rule>
单击该按钮将产生相同的错误“为关键字参数'x'获得多个值”
即使我认为作为参数发送的是对类的调用,也应该对UI元素本身(通常为False的值)进行一些愚蠢的调用,应将其放在* _中,捕获所有参数,然后输入关键字x的参数。