Как корректно передать обязательный параметр в функцию с *args

Параметр b после *args является обязательным keyword-only. Передавайте его по имени: foo(1, 2, b=3) или foo(b=3).

Короткий ответ

Что ответить на собеседовании

Параметр 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).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее