Выбор ответа Senior Функции и области видимости обновлено
Распаковка ** и повторяющийся аргумент
Вопрос
Что произойдёт при вызове?
def f(**kw):
return kw
opts = {'a': 2}
f(a=1, **opts)
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: TypeError: аргумент a передан дважды. Явный a=1 и распакованный словарь с ключом a дают два значения одного параметра, и Python бросает TypeError: f() got multiple values for keyword argument 'a'.
Варианты ответа
fполучитa=2: последний аргумент побеждаетfполучитa=1: явный аргумент приоритетнееSyntaxErrorпри компиляцииTypeError: аргументaпередан дваждыправильный ответ
Разбор
Явный a=1 и распакованный словарь с ключом a дают два значения одного параметра, и Python бросает TypeError: f() got multiple values for keyword argument 'a'. Ошибка возникает при вызове, а не при компиляции, ведь содержимое словаря известно только в рантайме. Перезапись «последний побеждает» работает в литерале словаря {**opts, "a": 1}, а не при вызове функции.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Функции и области видимости»
- Что такое *args и **kwargs
- Перекрытие встроенных имён
- Как передаются аргументы в функцию Python
- Где хранятся переменные замыкания
- Вызов с *args и **kwargs: разбор сигнатуры
- Композиция функций
- Мемоизация через замыкание
- Повтор вызова с ограничением попыток