Joe*_*ley 7 python dictionary keyword-argument
我试图在函数调用(通过dict和关键字参数)中使用模板关键字args,同时能够覆盖一些参数.
例如,如果我们从包含该行的模块mymod开始 template_kvps = {'a': 1, 'b': 2}
我可以:
import mymod
def func(**kwargs):
pass
func(**mymod.template_kvps)
Run Code Online (Sandbox Code Playgroud)
然后我可以访问我的template_kvps内部func().但我希望能够以a最小的开销传递不同的值.
我能想到的只是在函数调用之前更改字典:kvps = {**template_kvps, 'a': 3}; func(**kvps),但这是行数的两倍,我在大约1000个测试脚本中的每一个中都使用了这个函数几次.
理想情况下func,我想要重新定义,以便我可以做到,func(**mymod.template_kvps, a=3)但事实上,Python错误与重复参数有关.
顺便说一下,我很高兴考虑改变模板kvps的格式.
后来添加的注释我问的问题有一些很好的答案(我已经接受了我认为是我问的最佳答案),但我想我已经问了一件坏事.我建议这是一个设计问题,如果我想要这样的默认参数,我认为最好用默认参数而不是模板字典创建包装器方法,如
def func_template(a=1, b=2):
func(a, b)
func_template(a=3)
Run Code Online (Sandbox Code Playgroud)
您可以使用内置dict类型来实现此目的.它接受另一个dict作为参数,并接受其他键值对作为关键字参数(优先于其他字典中的值).
因此,您可以通过创建更新的字典dict(template_vars, a=1).
您可以将此dict展开为关键字参数:func(**dict(...)).
这样就不需要更改函数的签名了,您可以根据需要更新/添加任意数量的键值对.
您可以像这样一行完成:
func(**{**mymod.template_kvps, 'a': 3})
Run Code Online (Sandbox Code Playgroud)
但这乍一看可能并不明显,但与您之前所做的一样明显。
我建议使用多个模板(例如template_kvps_without_a),但这取决于您的具体用例:
func(**mymod.template_kvps_without_a, a=3)
Run Code Online (Sandbox Code Playgroud)