Углублённо о функциях: *args, **kwargs и значения по умолчанию
Проектируйте сигнатуры функций гибкими, безопасными и удобными для вызова
*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.