Параметр b после *args является обязательным keyword-only. Передавайте его по имени: foo(1, 2, b=3) или foo(b=3).
Как корректно передать обязательный параметр в функцию с *args
Параметр b после *args является обязательным keyword-only. Передавайте его по имени: foo(1, 2, b=3) или foo(b=3).
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо вызвать функцию, передав значение обязательному параметру b, учитывая, что в её сигнатуре присутствует произвольный набор позиционных аргументов, собираемых через *args.
def foo(*args, b):
pass
Ответ
Параметр b после *args является обязательным keyword-only. Передавайте его по имени: foo(1, 2, b=3) или foo(b=3).
def foo(*args, b):
return args, b
assert foo(1, 2, b=3) == ((1, 2), 3)
assert foo(b=3) == ((), 3)
Вызов foo(1, 2, 3) не заполнит b: все три позиционных значения попадут в args, после чего Python сообщит об отсутствующем обязательном keyword-only аргументе.
Можно использовать и распаковку foo(**{'b': 3}). Значение по умолчанию для b не задано, поэтому его необходимо передавать при каждом вызове. Для необязательного параметра сигнатура выглядела бы как def foo(*args, b=0).