将 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
提供了两个参数,data
和 kwargs
,一个字典.
即使字典为空,它仍然是一个单独的项目,它被识别为另一个参数(而不是命名参数序列 func1
被调用),因此出现错误消息。
因为 func2
期望以下列方式被调用:
func2(data, arg1='alpha', arg2='beta', arg3=... )
Unpacking 需要词典。 func1
因此应该是:
def func1(data, **kwargs):
func2(data, **kwargs)
请注意 func2
调用中的 **
,这使得字典被解压并类似于 func2
期望的调用。
发生错误时我正在编写包装器方法。我设法将问题简化为以下代码:
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
提供了两个参数,data
和 kwargs
,一个字典.
即使字典为空,它仍然是一个单独的项目,它被识别为另一个参数(而不是命名参数序列 func1
被调用),因此出现错误消息。
因为 func2
期望以下列方式被调用:
func2(data, arg1='alpha', arg2='beta', arg3=... )
Unpacking 需要词典。 func1
因此应该是:
def func1(data, **kwargs):
func2(data, **kwargs)
请注意 func2
调用中的 **
,这使得字典被解压并类似于 func2
期望的调用。