Что такое *args и **kwargs?

Краткий ответ (для собеседования): *args и **kwargs позволяют функции принимать переменное число аргументов. *args собирает дополнительные позиционные аргументы в кортеж, а **kwargs собирает дополнительные именованные аргументы в словарь.

Подробный ответ

Развернутое объяснение
Зачем нужны *args и **kwargs? Иногда заранее неизвестно, сколько аргументов понадобится функции: два, три или десять. В таких случаях используют переменное число аргументов. Python даёт для этого два специальных механизма:

*args — для дополнительного списка позиционных аргументов;

**kwargs — для дополнительного набора именованных аргументов (пара имя=значение).

На собеседованиях важно показать, что вы понимаете именно идею: «сделать функцию более гибкой по количеству входных параметров».

Что такое *args? 

*args в определении функции означает: «Собери все дополнительные позиционные аргументы в один кортеж с именем args». Пример:

def avg(*args):
   return sum(args) / len(args)
avg(1, 2, 3)      # 2.0
avg(10, 20, 30, 40)  # 25.0

Особенности, которые полезно озвучить:

Внутри функции args — это кортеж. Можно комбинировать обычные параметры и *args, но обычные параметры должны идти до *args.

def log(prefix, *messages):
   for msg in messages:
       print(prefix, msg)
log("[INFO]", "start", "processing", "done")

Что такое **kwargs?

**kwargs в определении функции означает: «Собери все дополнительные именованные аргументы в словарь с именем kwargs». Пример:

def create_user(**kwargs):
   # kwargs — словарь
   return kwargs
create_user(name="Alex", age=30, role="admin")
# {'name': 'Alex', 'age': 30, 'role': 'admin'}

Важные моменты:

Внутри функции kwargs — это словарь. Имена ключей совпадают с именами аргументов, переданных при вызове. Частый практический сценарий в backend: проксировать параметры дальше, например, в конструктор или базовую функцию:

def wrapped_request(url, **options):
   options.setdefault("timeout", 5)
   return http_request(url, **options)

Совместное использование и порядок аргументов

В одной функции можно использовать и *args, и **kwargs, но порядок параметров важен. Правило таково: сначала обычные позиционные параметры, далее *args. Далее именованные параметры (если есть) и наконец **kwargs. Пример:

def handle_request(method, url, *args, retry=3, **kwargs):
   ...

Такое объявление позволяет функции быть гибкой и по количеству обычных аргументов, и по набору именованных настроек.

Как сформулировать ответ на собеседовании?

*args и **kwargs позволяют функции принимать переменное число аргументов. *args собирает дополнительные позиционные аргументы в кортеж, а **kwargs — дополнительные именованные аргументы в словарь. Это удобно, когда заранее неизвестно, сколько параметров придёт в функцию или когда нужно прозрачно прокинуть аргументы дальше.

Такой ответ показывает, что ты понимаешь не только синтаксис, но и практический смысл — именно это мы отрабатываем в задачах и проектах на TeoBrain, где *args и **kwargs часто используются в декораторах, обёртках и общих инфраструктурных функциях.

 

Читать полную статью в блоге