Python 3.10中functools partial绑定首参后传参异常问题
问题解决方法
你遇到的报错原因很直接:用partial(foo1, a=10)是把a以关键字参数的形式绑定死了,但原函数里a是第一个位置参数。当调用pfoo1("testme")这类带位置参数的写法时,Python会把这个位置参数当成给a传值,可a已经被绑定成10了,自然就报“给参数a传了多个值”的冲突错误。
下面给你两个不用修改原函数的简单解决办法:
方法一:直接用位置参数绑定a(最简便)
放弃关键字绑定的写法,直接把10作为位置参数传给partial:
from functools import partial def foo1(a : int, *args, **kwargs): print(a) print(args) print(kwargs) pfoo1 = partial(foo1, 10) # 直接传10,而非a=10 pfoo1("testme") # 正常运行,args会接收('testme',) pfoo1(*["testme"]) # 正常运行 pfoo1(something="testme") # 正常运行
这种写法下,partial会把10固定为a的位置参数,后续传入的所有位置参数都会自动归入*args,完全匹配你的需求。
方法二:用包装函数兜底
如果因为特殊场景必须保留关键字绑定逻辑,可以写个简单的包装函数,把所有传入的位置、关键字参数转交给原函数,同时固定a=10:
from functools import partial def foo1(a : int, *args, **kwargs): print(a) print(args) print(kwargs) # 用lambda快速实现,或者写普通函数更直观 pfoo1 = lambda *args, **kwargs: foo1(10, *args, **kwargs) # 也可以写成: # def pfoo1(*args, **kwargs): # return foo1(10, *args, **kwargs) pfoo1("testme") # 正常运行 pfoo1(*["testme"]) # 正常运行 pfoo1(something="testme") # 正常运行
内容的提问来源于stack exchange,提问作者crogg01
相关产品推荐
相关产品推荐

