Python functools.partial希望将位置参数用作关键字参数

Python functools.partial希望将位置参数用作关键字参数,python,partial-application,Python,Partial Application,因此,我试图理解部分代码: import functools def f(x,y) : print x+y g0 = functools.partial( f, 3 ) g0(1) 4 # Works as expected 在: 在: 如果我将y用作关键字参数,则TypeError将消失: 在: 是什么导致了TypeError?这与functools.partial没有任何关系。实际上,您是这样调用函数的: f(1, x=3) Python首先完成位置参数,您的第一个参数是x

因此,我试图理解部分代码:

import functools

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

g0 = functools.partial( f, 3 )
g0(1)

4 # Works as expected
在:

在:

如果我将
y
用作关键字参数,则
TypeError
将消失:

在:


是什么导致了
TypeError

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

f(1, x=3)
Python首先完成位置参数,您的第一个参数是
x
。然后应用关键字参数,然后再次提供
x

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


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

要扩展@Martijn Pieters answer,这就是如何保留第二个参数的位置性质。此处,g2的参数按位置传递为y:

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

g2 = functools.partial( f, *[3] )
g2(1)
当我们试图替换f的一组初始参数时,这是可行的。我不知道如何使用
partial
替换三参数函数的第二个参数,并允许按位置传递第一个和第三个参数。
但是你可以用一个lambda表达式来表达。

不是一个答案,而是一个后续问题(因为我不能在没有50个声誉的情况下添加评论),请你详细说明或使用简单的术语,因为这里的答案超出了我的理解范围。 我在Maya中使用按钮时遇到类似问题

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()
单击按钮将出现相同的错误“为关键字参数“x”获取多个值”


即使我认为作为参数发送的是对类的调用,对UI元素本身的一些愚蠢调用(通常为False值),这些调用应该放在*uuu-catch-all参数中,然后放在x的关键字参数中。

有没有办法以任意方式填充默认参数,在args/kwargs链中只留下一个参数的函数吗?@chiffa:我不知道你的意思。除非函数有
*args
**kwargs
捕获所有参数,否则不能向函数传递任意参数。如果一个函数有关键字参数(
name=some_default
),那么你不必为这些参数提供任何东西,如果你忽略它们,它们已经有了默认值。我意识到这就是我的问题所在。我试图用一系列参数绘制一个函数,其中一组参数总是以相同的方式变化,尽管需要更改一些其他参数以绘制对比图并简化这些图的编写,但我尝试生成一个部分函数,该函数自动提供未更改的参数。它起作用了,但我需要为分部函数提供参数,如
my_partial_函数(param_name=param)
。如果有帮助,您应该打开一个新问题并参考这个问题。它有助于保持事物的干净和可搜索性。
f(1, x=3)
def f(x,y) :
    print x+y

g2 = functools.partial( f, *[3] )
g2(1)
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()