Python:在方法调用args中,覆盖unpacked dict的关键字参数

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)

a_g*_*est 6

您可以使用内置dict类型来实现此目的.它接受另一个dict作为参数,并接受其他键值对作为关键字参数(优先于其他字典中的值).

因此,您可以通过创建更新的字典dict(template_vars, a=1).

您可以将此dict展开为关键字参数:func(**dict(...)).

这样就不需要更改函数的签名了,您可以根据需要更新/添加任意数量的键值对.


Art*_*yer 5

您可以像这样一行完成:

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)