Позиционные-only и keyword-only параметры в Python: разбор примера

Позиционные-only и keyword-only параметры в Python: разбор примера

@python_quiz

Разберем этот квиз

Коротко: в примере используется синтаксис "/" и "*" в сигнатуре функции, который задаёт строгое поведение для передачи аргументов. Это влияет на то, можно ли передавать параметры по позиции или по имени.

Исходный код

python

Этот код напечатает строку, объединяющую значение 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

(Сообщения об ошибках могут немного различаться в зависимости от версии Python.)

Практические советы

  • Используйте / если хотите зафиксировать параметры как позиционные (полезно для совместимости с C API или когда имя аргумента не имеет смысла для внешнего интерфейса).
  • Используйте * чтобы требовать именованных аргументов (улучшает читаемость и предотвращает ошибки при изменении порядка параметров).
  • Читайте сигнатуру функции: её конструкция подсказывает допустимые способы вызова.

Вывод: в приведённом примере комбинация / и * делает user только позиционным и active только именованным — поэтому вызов с 'root' по позиции и active=False по имени корректен и вернёт "root:False".

Report Page