functools.partial希望使用位置参数作为关键字argumen

2024-09-27 04:29:17 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试图理解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


Tags: importdefasmultiplepartialexpectedvaluesprint
3条回答

这和functools.partial没有关系,真的。您实际上是这样调用函数:

f(1, x=3)

Python首先实现位置参数,第一个参数是x。然后应用关键字参数,然后再次提供x

functools.partial()无法检测您是否已将第一个位置参数作为关键字参数提供。它不会通过用y=关键字参数替换位置参数来增加调用。

混合位置参数和关键字参数时,必须注意不要使用同一参数两次。

不是一个答案,一个后续问题(因为我不能添加一个没有50个声誉的评论),你能详细说明或使用简单的术语,因为这里的答案超出了我的理解。 我在玛雅使用按钮也有类似的问题

import maya.cmds as cmds
from functools import partial

class Myclass(object):
    def __init__(self):
        pass
    def createui(self):
        derp = cmds.window()
        cmds.formLayout()
        cmds.button(label = "w/e", c = partial(self.f, x = 3))
        cmds.showWindow(derp)
    def f(self, x = 5, y = 3, *_):
        print(x+y)

herp = Myclass()
herp.createui()

单击按钮将给出相同的错误“got multiple values for keyword argument'x'”

尽管我认为作为参数发送的是对类的调用,但对UI元素本身的一些愚蠢的调用(通常是False的值)应该放在*\catch all参数中,然后放在x的keyword参数中

要扩展@Martijn Pieters答案,这就是如何保留第二个参数的位置性质。这里,g2的参数以y的位置传递:

def f(x,y) :
    print x+y

g2 = functools.partial( f, *[3] )
g2(1)

当我们试图替换f的一个初始参数集时,这是有效的。我不知道如何使用partial来替换例如,仅替换3参数函数的第二个参数,并允许第一个和第三个参数按位置传递。 但你可以用lambda表达式来实现。

相关问题 更多 >

    热门问题