Python 关键字参数

0 投票
2 回答
783 浏览
提问于 2025-04-15 22:12

我有几个函数在调用时,会传递一个包含关键字参数的公共字典:

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)

因为字典中的关键字参数会覆盖位置参数中的值(如果有的话)。

撰写回答