Глава 13 · Автоматизация с помощью функций

Positional-only и keyword-only

Иногда хочется заставить аргумент передаваться только по имени (или только по позиции) — сигнатура функции умеет это явно требовать.

Keyword-only параметры — практично уже сейчас

Бывают параметры, которые ХОЧЕТСЯ заставить передавать только по имени — обычно это необязательные флаги или настройки, где голая позиция путает читателя:

keyword_only.py
def draw_rectangle(width, height, *, color="blue", filled=False):
    ...

draw_rectangle(100, 50, color="red")   # можно
Одинокая * в списке параметров
Всё, что стоит ПОСЛЕ одинокого * в определении функции, обязано передаваться по имени при вызове — позиционно эти параметры передать нельзя.
bez_keyword_only.py
draw_rectangle(100, 50, "red", True)
# что здесь True? filled? Неочевидно.
s_keyword_only.py
draw_rectangle(
    100,
    50,
    color="red",
    filled=True,
)
# сразу понятно, что есть что

Второй вариант читается и понимается значительно быстрее — именно ради этого существуют keyword-only параметры.

Чуть глубже — positional-only параметры

Реже, но тоже встречается обратная ситуация: параметр, который МОЖНО передавать только позиционно, без имени.

positional_only.py
def function(x, /):
    ...
Одинокая / в списке параметров
Всё, что стоит ДО /, можно передать только позиционно — имя параметра нельзя использовать при вызове. Так делают, когда автор функции не хочет, чтобы имя параметра стало частью «контракта» — его можно будет свободно менять в будущем, не ломая код, который её вызывает.

Анатомия полной сигнатуры

signatura.py
def draw(
    x, y, /,
    width, height,
    *,
    color="blue",
    filled=False,
):
    ...
Одна сигнатура, три зоны
x, y
только позиционно
до /
width, height
позиционно ИЛИ по имени
между / и *
color, filled
только по имени
после *
Не обязательно запоминать наизусть с первого раза
Это продвинутая, но ценная грамотность чтения API — она особенно пригодится при чтении документации сторонних библиотек. Для собственных небольших функций чаще всего достаточно обычных параметров без / и одинокой * — используйте их осознанно, когда это действительно улучшает читаемость вызова.
Практика: keyword-only параметры
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →