Python中能否同时使用位置参数与**kwargs关键字参数?
Python位置参数与
**关键字参数混合使用说明 Python原生支持在同一次函数调用中同时传入位置参数和**形式解包的关键字参数,你遇到的报错和参数类型混合无关,是传参写法错误导致的。
报错核心原因
你定义的函数签名为def test_args_2(x, **z):,其中:
x是唯一的位置形参**z是可变关键字形参,只能接收key=value形式传入的额外关键字参数,会自动将这些参数打包为字典赋值给z
你写的调用代码test_args_2(4, d),是把字典d直接作为第二个位置参数传入了,但函数仅定义了1个位置形参,没有多余的位置参数位置接收d,因此触发TypeError: test_args_2() takes 1 positional argument but 2 were given报错。
正确调用写法
要将字典传给**z形参,必须在字典变量前加**做解包,告知解释器将字典内的键值对拆分为独立的关键字参数传入,修正后的代码如下:
def test_args_2(x, **z): print(x, z) d = {'a':4, 'b':5} # 字典传给**形参时必须加**前缀解包 test_args_2(4, **d)
运行后正常输出结果:4 {'a': 4, 'b': 5}
合法传参顺序说明
Python允许混合使用不同类型的参数,只要遵循从左到右的固定顺序即可,顺序优先级为:
- 必选位置参数
- 带默认值的位置参数
*args形式的可变位置参数- 普通关键字参数(可带默认值)
**kwargs形式的可变关键字参数
只要符合上述顺序,同一行代码中混合传入位置参数、普通关键字参数、*解包的可迭代对象、**解包的字典均为合法操作。
内容的提问来源于stack exchange,提问作者Saro
相关产品推荐
相关产品推荐

