Перейти к содержанию

Углублённо о функциях: *args, **kwargs, значения по умолчанию

Начало урока

Углублённо о функциях: *args, **kwargs и значения по умолчанию

Проектируйте сигнатуры функций гибкими, безопасными и удобными для вызова

Главная идея: сигнатура функции — это контракт о том, как вызывающий код передаёт данные внутрь. Python даёт богатый набор средств — значения по умолчанию, именованные аргументы, *args и **kwargs, — чтобы одна функция принимала множество стилей вызова, не становясь хрупкой. При грамотном применении они убирают лишний код; при небрежном — прячут тонкие ошибки.
К концу темы вы сможете:
  • передавать аргументы по позиции и по имени и понимать, когда что нагляднее;
  • задавать параметрам значения по умолчанию и рассуждать, когда они применяются;
  • собирать любое число дополнительных позиционных аргументов через *args (кортеж);
  • собирать любое число дополнительных именованных аргументов через **kwargs (словарь);
  • правильно упорядочивать параметры и объявлять только-именованные параметры;
  • распаковывать последовательности и словари в вызов с помощью * и **;
  • избегать печально известной ловушки изменяемого значения по умолчанию.

1. Позиционные и именованные аргументы

Вы уже вызываете функции. Есть два способа передать каждый аргумент. Позиционный аргумент сопоставляется параметру по его позиции в вызове. Именованный аргумент сопоставляется по имени и записывается как имя=значение.

def book_room(guest, nights, breakfast):
    print(guest, "-", nights, "nights, breakfast:", breakfast)

# Все позиционные: порядок решает, что куда попадёт
book_room("Mara", 3, True)

# Все именованные: порядок больше не важен, важны имена
book_room(nights=3, guest="Mara", breakfast=True)

# Смешанно: сначала позиционные, потом именованные
book_room("Mara", breakfast=True, nights=3)

Вывод:

Mara - 3 nights, breakfast: True
Mara - 3 nights, breakfast: True
Mara - 3 nights, breakfast: True

Именованные аргументы делают вызов самодокументируемым: book_room("Mara", 3, True) заставляет читателя помнить, что означает True, а breakfast=True произносит это вслух. Одно жёсткое правило: как только вы использовали именованный аргумент, все аргументы после него тоже должны быть именованными. Позиционный аргумент никогда не может идти после именованного.

book_room(guest="Mara", 3, True) вызовет SyntaxError: positional argument follows keyword argument.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя