为什么我会出现意外的关键字参数TypeError错误?

29

我正在测试一些带有*args**kwargs的代码,并为**kwargs编写了一个字典。由于某种原因,我得到了:

def func(*args, **kwargs):
    if args:
        second_test(*args)
    elif kwargs:
        second_test(**kwargs)

def second_test(stringa, integera, floata):
    print("Name: %s, Problems Correct: %d, Points: %f" % (stringa, integera, floata))

profile_1 = ["David", 21, 132.00]
func(*profile_1)

profile_1a = {'Name': 'David', 'Problems Correct': 21, 'Points': 132.00}
func(**profile_1a)

代码从第44行开始,到第57行结束。这是我遇到的错误:

TypeError: second_test() got an unexpected keyword argument 'Name'

我在谷歌上搜索了“unexpected keyword argument”,但我找不到定义,只有其他的stackoverflow文章。我的代码有什么问题?


3
根据你的代码,second_test不接受名为Name的关键字参数。从第二次调用func(**profile_1a)开始,按照代码的流程即可。 - 9769953
2
在您看来,**profile_1a是什么?意思是,当您使用**作为字典的前缀时,您认为发生了什么? - ChatterOne
2个回答

20
当将kwargs传递到函数中时,它期望在列表中找到完全相同的变量名。如果您的字典键名为stringaintegerafloata,那么该函数将可以正常工作。
因此,您需要更改函数变量名更改字典中的键名才能使其正常工作。

14

关键字参数是所有以名称方式传递的“未知/意外”的命名参数。

例如,让我们定义一个带有一个参数的函数。

def func(a):
    print(a)

现在,如果我们使用如下方式调用带有“意外”命名参数的函数
func(b=3) # remember we didn't define b as an argument

如果我们不修改函数接受这些“意外”的命名参数,那么就会出现TypeError。但是,如果我们修改函数以接受这些“意外”的命名参数,那么我们就可以运行先前的代码。
def func(a, **kwargs):
    print(a)
    print(kwargs["b"]) # now, if we pass an argument 'b' to the function, this will print its value (if we don't, we get a KeyError)

> func(3, b=15)
3
15


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接