Я тестирую некоторый код с *args и **kwargs, и я написал dictionary для **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)

Код начинается с line 44 и заканчивается на line 57. Это ошибка, которую я получаю:

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

Я погуглил «неожиданный аргумент ключевого слова», но не могу найти определение; только другие статьи, посвященные stackoverflow. Что не так с моим кодом?

13
mpnm 15 Авг 2019 в 09:51

2 ответа

Лучший ответ

При передаче kwargs в функцию она ожидает найти точное имя переменной в списке. Если вместо этого ваши ключи словаря были stringa, integera и floata, функция работала бы без проблем.

Таким образом, вам нужно либо изменить имена переменных функций , либо изменить имена ключей в своем словаре, чтобы это работало

1
mishsx 15 Авг 2019 в 07:06

Аргумент ключевого слова - это весь неизвестный / неожиданный аргумент named , передаваемый по имени.

Например, давайте определим функцию с одним аргументом

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

1
Thinker 15 Ноя 2019 в 22:55