Позиционные и именованные аргументы в Python (/, *)

Позиционные и именованные аргументы в Python (/, *)

@python_quiz

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

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

Пример из квиза:

python

Разберём, что здесь происходит и почему такой вызов корректен.

Что означают / и *

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

Выполнение кода

python

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

Анализ возможных утверждений (вариантов)

  • "Ошибка: a нельзя передать позиционно"

Неверно. a специально помечен как позиционный-only (через /), значит его именно нужно передавать позиционно.

  • "Ошибка: c нельзя передать как ключевой аргумент"

Неверно. c стоит после *, то есть он — keyword-only; его как раз нужно передавать в виде c=значение.

  • "(1, 2, 3)"

Соответствует действительному результату при вызове f(1, b=2, c=3).

  • "Ошибка: b нельзя передать как ключевой аргумент"

Неверно. b находится между / и *, следовательно его можно передавать и позиционно, и по имени.

Дополнительные примеры (чтобы закрепить понимание)

python

Вывод

  • Используйте / чтобы явно пометить параметры как только позиционные.
  • Используйте * чтобы сделать параметры после неё только именованными.
  • Параметры между / и * можно передавать любым способом.

Понимание этой нотации помогает писать более читаемые API и контролировать, как пользователи вызывают функции.

Report Page