Параметры, *args и **kwargs
Что это и зачем
Параметр объявляется в определении, аргумент передаётся при вызове. Python поддерживает позиционные и именованные аргументы и значения по умолчанию.
Как это работает
*args собирает лишние позиционные аргументы в tuple, **kwargs — именованные в dict. * при вызове распаковывает iterable, ** — mapping. Символ / ограничивает позиционные параметры, * ограничивает именованные.
def greet(name='Guest'):
return name
print(greet())
Когда применять
Используйте keyword-only параметры для флагов с неочевидным смыслом. Значение None в default позволяет создавать новый изменяемый объект внутри вызова. Документируйте допустимые сочетания аргументов.
Границы применения
Значение по умолчанию вычисляется при def один раз. Список в default разделяется всеми вызовами. Избыточные *args/**kwargs могут скрыть настоящий контракт функции.
Ошибки и лучшие практики
Один параметр нельзя передать одновременно позиционно и по имени. Позиционные аргументы идут до обычных именованных. При ** ключи должны быть строками.
Понятна идея? Теперь проверим её в действии.