Позиционные-only и keyword-only параметры в Python: разбор примера
@python_quizРазберем этот квиз
Коротко: в примере используется синтаксис "/" и "*" в сигнатуре функции, который задаёт строгое поведение для передачи аргументов. Это влияет на то, можно ли передавать параметры по позиции или по имени.
Исходный код

Этот код напечатает строку, объединяющую значение user и значение active.
Что означают "/" и "*" в сигнатуре
- Параметры слева от
/— positional-only. Их можно передавать только по позиции, попытка использовать имя (user=...) вызоветTypeError. - Параметры справа от
*— keyword-only. Их можно передавать только по имени, попытка передать их позиционно приведёт кTypeError. - Параметры между
/и*(если есть) поддерживают оба способа (позиционно и по имени).
Синтаксис с / появился в Python 3.8 (PEP 570).
Разбор вызова
В вызове fetch('root', active=False):
'root'передаётся по позиции — это корректно дляuser(позиционный-only).active=Falseпередано по имени — это корректно дляactive(keyword-only).
Следовательно, функция вернёт строку с user = "root" и active = False, то есть:

Анализ вариантов и почему они верны/неверны
- Выведет: root:False
Обоснование: соответствует описанному правилу / и *. Правильный результат фактически будет именно такой.
- Выведет: root:True
Неверно, потому что в вызове явно передаётся active=False, а не используется значение по умолчанию True.
TypeError: user должен передаваться как ключевой аргумент
Неверно. Наоборот: user — позиционный-only, поэтому попытка передать его как именованный аргумент вызвала бы TypeError, а не требование передать его как ключевой.
TypeError: active нельзя передавать как ключевой аргумент
Неверно. active находится в разделе keyword-only (справа от *), поэтому именно передача именованного аргумента — корректный способ. Ошибка возникла бы, если бы попытались передать active позиционно (например, fetch('root', False)).
Дополнительные примеры
Покажу несколько вызовов и их поведения:

(Сообщения об ошибках могут немного различаться в зависимости от версии Python.)
Практические советы
- Используйте
/если хотите зафиксировать параметры как позиционные (полезно для совместимости с C API или когда имя аргумента не имеет смысла для внешнего интерфейса). - Используйте
*чтобы требовать именованных аргументов (улучшает читаемость и предотвращает ошибки при изменении порядка параметров). - Читайте сигнатуру функции: её конструкция подсказывает допустимые способы вызова.
Вывод: в приведённом примере комбинация / и * делает user только позиционным и active только именованным — поэтому вызов с 'root' по позиции и active=False по имени корректен и вернёт "root:False".