如何动态确定Python函数调用使用的参数并实现动态传参
解决方案
Python原生支持通过解包语法实现动态关键字参数传参,直接在参数字典前加**运算符即可。
问题原因
你之前的写法是把整个字典对象作为位置参数传给了f1的第一个形参a,b和c仍然取默认值0,整数和字典做加法运算自然会报错,完全达不到按参数名匹配传值的效果。
正确写法
注意不要用dict作为变量名——这是Python内置的字典类名,直接覆盖会引发意外问题,建议改成有语义的参数变量名:
def f1(a = 0, b = 0, c = 0): return a + b + c params = {'a': 1, 'c': 3} print(f1(**params)) # 输出4,符合预期
原理说明
**作用在作为实参传入的字典上时,会自动把字典的键值对拆解为键=值格式的关键字参数,和你手动写f1(a=1, c=3)的效果完全一致:
- 字典里存在的键,会把对应值传给同名形参
- 字典里不存在的形参,会自动使用函数定义时写的默认值
如果需要动态传位置参数,可以用*解包列表/元组,元素会按顺序对应位置形参:
pos_args = [1, 3] # 按顺序对应a、b,c取默认值0 print(f1(*pos_args)) # 输出1+3+0=4
注意事项
- 传入的字典键名必须和函数形参名完全匹配,不能传入函数未定义的参数名,否则会抛出
TypeError: f1() got an unexpected keyword argument 'xxx'错误 - 动态传参时如果同时存在位置参数、
*解包的位置参数、关键字参数、**解包的关键字参数,要遵循Python参数顺序规则:位置参数在前,关键字参数在后。
内容的提问来源于stack exchange,提问作者ps0604
相关产品推荐
相关产品推荐

