将 kwargs 传递给函数会调用 TypeError

Passing kwargs to a function invokes TypeError

发生错误时我正在编写包装器方法。我设法将问题简化为以下代码:

def func1(data, **kwargs):
    func2(data, kwargs)

def func2(data, **kwargs):
    print(data)

当运行 func1时出现TypeError: func2() takes 1 positional argument but 2 were given

无论我在函数调用中放入什么命名参数,都会发生错误。但是,如果我不将 kwargs 传递给 func2,一切都会顺利进行。

我找到的关于错误消息的大部分信息都涉及 class 方法未调用 self,但事实并非如此。

事实证明,当从 func1 中调用 func2(data, kwargs) 时,我们向 func2 提供了两个参数,datakwargs,一个字典.

即使字典为空,它仍然是一个单独的项目,它被识别为另一个参数(而不是命名参数序列 func1 被调用),因此出现错误消息。

因为 func2 期望以下列方式被调用:

func2(data, arg1='alpha', arg2='beta', arg3=... )

Unpacking 需要词典。 func1 因此应该是:

def func1(data, **kwargs):
    func2(data, **kwargs)

请注意 func2 调用中的 **,这使得字典被解压并类似于 func2 期望的调用。