Что такое *args и **kwargs?
- Зачем нужны звёздочки в аргументах функции?
- Как передать в функцию произвольное число аргументов?
*args собирает лишние позиционные аргументы в кортеж, **kwargs — лишние именованные в словарь.
- Имена условные, важны
*и** - При вызове те же звёздочки распаковывают:
f(*lst, **opts)
А ещё Покажите keyword-only после * и positional-only до /
Подробно
В определении функции:
*argsпринимает все позиционные аргументы, не попавшие в обычные параметры, — получается кортеж;**kwargsпринимает все именованные аргументы, которым нет параметра, — получается словарь.
Порядок в сигнатуре: обычные параметры, *args, параметры только по имени, **kwargs. Всё, что стоит после *args (или после одиночной *), можно передать только по имени. Всё, что стоит до / (Python 3.8+), — только позиционно.
При вызове звёздочки работают наоборот: f(*[1, 2]) раскладывает список в позиционные аргументы, f(**{"a": 1}) — словарь в именованные.
Типичные применения: декораторы и обёртки, которые передают аргументы дальше без изменений (return func(*args, **kwargs)); функции с переменным числом аргументов, как print; расширяемые конфигурации.
Пример
def show(first, *args, sep=", ", **kwargs):
print(first, args, sep, kwargs)
show(1, 2, 3, sep=";", debug=True)
# 1 (2, 3) ; {'debug': True}
def point(x, y, /, *, scale=1): # x, y — только позиционно; scale — только по имени
return x * scale, y * scale
nums = [3, 4]
point(*nums, scale=2) # (6, 8)Что хотят услышать
args— кортеж,kwargs— словарь.- Звёздочки при вызове — распаковка.
- Применение в декораторах.
- Знание keyword-only и positional-only параметров — плюс.
Частые ошибки
- Думать, что
args— список. - Ставить
**kwargsперед*args.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗*args — список позиционных аргументов, **kwargs — словарь именованных
- ✗*args — словарь именованных аргументов, **kwargs — список позиционных
- ✓*args собирает лишние позиционные аргументы в кортеж, **kwargs — именованные в словарь
- ✗Имена args и kwargs обязательны, иначе звёздочки не работают
Что спросят дальше
Разбор темы
- Функции — аргументы, области видимости, замыкания и декораторы
Как передаются аргументы, *args и **kwargs, LEGB, ловушка изменяемого значения по умолчанию, замыкания и позднее связывание, декораторы и functools.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.