Позиционные и именованные аргументы в Python (/, *)
@python_quizРазберем этот квиз
Коротко: слэш (/) в сигнатуре функции делает предыдущие параметры только позиционными, а звёздочка (*) — делает последующие параметры только именованными (keyword-only). Между ними находятся параметры, которые можно передавать и позиционно, и по имени.
Пример из квиза:

Разберём, что здесь происходит и почему такой вызов корректен.
Что означают / и *
- a, / — всё, что до слэша, — только позиционные аргументы. Для a это значит: можно передать f(1), но нельзя f(
a=1). - b (между / и *) — может передаваться и позиционно, и как именованный аргумент: f(1, 2,
c=3) и f(1,b=2,c=3) обе формы допустимы. - *, c — всё, что после звёздочки, — только именованные аргументы. Для c это значит: нужно писать c=..., нельзя передавать его позиционно.
Выполнение кода

Этот вызов корректен и выведет:

Анализ возможных утверждений (вариантов)
- "Ошибка: a нельзя передать позиционно"
Неверно. a специально помечен как позиционный-only (через /), значит его именно нужно передавать позиционно.
- "Ошибка: c нельзя передать как ключевой аргумент"
Неверно. c стоит после *, то есть он — keyword-only; его как раз нужно передавать в виде c=значение.
- "(1, 2, 3)"
Соответствует действительному результату при вызове f(1, b=2, c=3).
- "Ошибка: b нельзя передать как ключевой аргумент"
Неверно. b находится между / и *, следовательно его можно передавать и позиционно, и по имени.
Дополнительные примеры (чтобы закрепить понимание)

Вывод
- Используйте / чтобы явно пометить параметры как только позиционные.
- Используйте * чтобы сделать параметры после неё только именованными.
- Параметры между / и * можно передавать любым способом.
Понимание этой нотации помогает писать более читаемые API и контролировать, как пользователи вызывают функции.