Python 关键字参数
我有几个函数在调用时,会传递一个包含关键字参数的公共字典:
def func1(**qwargs):
func2(**qwargs)
func3(**qwargs)
我想在后面的某些函数调用中提供一些默认参数,类似这样:
def func1(**qwargs):
func2(arg = qwargs.get("arg", default), **qwargs)
func3(**qwargs)
但是这样做会出现一个问题,如果arg已经在qwargs字典里,就会报错,提示“为关键字参数提供了多个值”。
我不想把qwargs["arg"]设置为默认值,因为那样的话,func3就会不合理地得到这个参数。我可以对qwargs做一个复制,然后在复制的字典里设置“arg”,但qwargs可能包含很大的数据结构,我不想复制它们(也许copy.copy不会复制,只有copy.deepcopy会?)。
在这种情况下,最符合Python风格的做法是什么呢?
2 个回答
1
要创建一个新的字典,里面的键和值和原来的字典一样,你可以使用
newdict=dict(qwargs)
如果qwargs里面的键不多,那这样做是很简单的。
如果可以的话,你可以把函数改写一下,让它们直接接受字典作为参数,而不是接受多个参数。
2
你可以创建一个新的字典,专门用来调用 func2
,这样就不会影响到原来的字典,后面调用 func3
时可以用原来的字典:
def func1(**qwargs):
d = dict(arg=default)
d.update(qwqargs)
func2(**d)
func3(**qwargs)
这适用于你想要在 qwargs
中为 arg
设置一个值,以覆盖 default
的情况。否则,如果你希望 default
能够覆盖 qwargs
中对 arg
的任何设置:
def func1(**qwargs):
d = dict(qwargs, arg=default)
func2(**d)
func3(**qwargs)
因为字典中的关键字参数会覆盖位置参数中的值(如果有的话)。