Python使用functools.partial调用出现参数多值错误原因咨询
Python functools.partial参数重复赋值错误原因解析
首先明确两个Python基础规则:
- Python函数调用时,位置参数会按照形参定义的顺序依次匹配,关键字参数会直接匹配对应名称的形参,同一个形参不能被多次赋值
functools.partial绑定的参数,会在调用新的可调用对象时,优先和用户传入的参数合并后再传递给原函数
第一段代码正常运行的原因
from functools import partial def add(a, b, c): return 100 * a + 10 * b + c add_part = partial(add, c = 2, b = 1) add_part(3) # 输出结果为312
这里用关键字参数固定了b和c的值,调用add_part(3)时只传入了1个位置参数,会按顺序匹配第一个未被固定的形参a,最终三个参数值为a=3、b=1、c=2,没有重复赋值,所以运行正常。
第二段代码报错的原因
def foo(x, y, z): return x+y+z bar = partial(foo, y=3) bar(1, 2)
这里用关键字参数固定了y=3,但调用bar(1,2)时传入了2个位置参数:
- 第一个位置参数
1正常匹配第一个形参x - 第二个位置参数
2会按顺序匹配第二个形参y
此时y已经被partial绑定了值3,又被位置参数赋值为2,同一个参数出现了两个值,所以触发got multiple values for argument 'y'的报错。
修复方案
如果要保留y=3的绑定,调用时可以明确指定第二个传入值是给z的:
bar(1, z=2) # 输出结果为6
或者在partial绑定时用位置参数固定前序的参数,避免位置匹配冲突:
# 固定第一个参数x=3 bar = partial(foo, 3) bar(1,2) # 输出结果为6
内容的提问来源于stack exchange,提问作者Igor Rivin
相关产品推荐
相关产品推荐

