Python函数传参:重复传同名关键字参数、临时修改字典传参方案
问题1:是否支持重复传同名关键字参数靠后值覆盖?
Python 3.8 环境下不支持。
该版本中只要函数调用时检测到重名关键字参数(无论参数是显式写入还是通过**解包字典生成),会直接抛出TypeError: my_func() got multiple values for keyword argument 'a'错误。后传入的同名关键字自动覆盖前序值的特性是Python 3.10才正式加入的,3.8及更早版本无法使用该写法。
问题2:是否有不修改原字典、无需单独新建字典的临时改参写法?
有,Python 3.5+ 全版本支持内联字典解包合并的写法,完全满足需求,不需要提前定义临时字典变量,也不会改动原字典内容:
# 临时将a参数值改为Goodbye传参,原my_dict不会有任何改动 my_func(**{**my_dict, 'a': 'Goodbye'})
写法逻辑:{**my_dict, 'a': 'Goodbye'}会在内存中生成一个独立的临时字典,先把原my_dict的所有键值对解包存入临时字典,再把后面显式声明的'a': 'Goodbye'写入,自动覆盖临时字典里a对应的原有值,整个过程不会读写原字典的内容。
如果需要临时修改多个参数,直接在后面追加键值对即可:
# 同时修改a和d的传入值 my_func(**{**my_dict, 'a': 'Goodbye', 'd': 99})
补充:如果后续升级到Python 3.10及以上版本,除了上述写法,还可以直接写成
my_func(**my_dict, a='Goodbye'),靠后写的显式关键字会自动覆盖解包出来的同名参数值,写法更简洁。
内容的提问来源于stack exchange,提问作者user112495
相关产品推荐
相关产品推荐

