Выбор ответа 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'.

Варианты ответа

  1. f получит a=2: последний аргумент побеждает
  2. f получит a=1: явный аргумент приоритетнее
  3. SyntaxError при компиляции
  4. TypeError: аргумент a передан дваждыправильный ответ

Разбор

Явный a=1 и распакованный словарь с ключом a дают два значения одного параметра, и Python бросает TypeError: f() got multiple values for keyword argument 'a'. Ошибка возникает при вызове, а не при компиляции, ведь содержимое словаря известно только в рантайме. Перезапись «последний побеждает» работает в литерале словаря {**opts, "a": 1}, а не при вызове функции.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.