所以我试图理解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'
如果我使用y
作为关键字参数,TypeError
将消失:
在:
g2( y=1 )
4
是什么导致了TypeError
?
这和
functools.partial
没有关系,真的。您实际上是这样调用函数:Python首先实现位置参数,第一个参数是
x
。然后应用关键字参数,然后再次提供x
。functools.partial()
无法检测您是否已将第一个位置参数作为关键字参数提供。它不会通过用y=
关键字参数替换位置参数来增加调用。混合位置参数和关键字参数时,必须注意不要使用同一参数两次。
不是一个答案,一个后续问题(因为我不能添加一个没有50个声誉的评论),你能详细说明或使用简单的术语,因为这里的答案超出了我的理解。 我在玛雅使用按钮也有类似的问题
单击按钮将给出相同的错误“got multiple values for keyword argument'x'”
尽管我认为作为参数发送的是对类的调用,但对UI元素本身的一些愚蠢的调用(通常是False的值)应该放在*\catch all参数中,然后放在x的keyword参数中
要扩展@Martijn Pieters答案,这就是如何保留第二个参数的位置性质。这里,g2的参数以y的位置传递:
当我们试图替换f的一个初始参数集时,这是有效的。我不知道如何使用
partial
来替换例如,仅替换3参数函数的第二个参数,并允许第一个和第三个参数按位置传递。 但你可以用lambda表达式来实现。相关问题 更多 >
编程相关推荐