functools.partial想要使用位置参数作为关键字参数

时间:2014-07-15 10:10:25

标签: python partial-application

所以我想了解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的原因是什么?

3 个答案:

答案 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的参数。