Глава 13 · Автоматизация с помощью функций

*args, **kwargs и распаковка

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

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

args_povtorenie.py
def total(*numbers):
    return sum(numbers)

total(1, 2, 3, 4)
numbers(1, 2, 3, 4)
Внутри функции numbers — обычный кортеж (глава 11)
args — просто общепринятое имя
Работает именно символ * перед параметром — имя args лишь общепринятое соглашение. def total(*numbers) работает совершенно так же, как def total(*args).

**kwargs — произвольное число именованных аргументов

kwargs.py
def show_profile(**fields):
    for key, value in fields.items():
        print(f"{key}: {value}")

show_profile(
    name="Anna",
    city="Warsaw",
)
fields{"name": "Anna","city":…
Внутри функции fields — обычный словарь (глава 11)
** собирает лишние именованные аргументы в словарь
Любые именованные аргументы, для которых нет отдельного параметра, попадают в словарь fields — ключ - имя аргумента, значение - переданное значение.

*args vs **kwargs

vyzov_s_oboimi.py
func(10, 20, color="red", size=3)
*args**kwargs
Собираетлишние позиционные аргументылишние именованные аргументы
Тип внутри функцииtupledict
В примере выше(10, 20){'color': 'red', 'size': 3}

Распаковка аргументов на месте вызова

Тот же символ */**, но теперь на стороне ВЫЗОВА, а не определения — связываем с распаковкой из главы 11:

raspakovka_pri_vyzove.py
point = (10, 20)
move(*point)   # эквивалентно move(10, 20)
(10, 20)кортеж*распаковкаmove(10, 20)два аргумента
* перед аргументом при вызове раскладывает кортеж/список на отдельные позиционные аргументы
raspakovka_slovarya.py
options = {
    "color": "red",
    "size": 3,
}
draw(**options)   # эквивалентно draw(color="red", size=3)

* и ** встречаются в нескольких разных контекстах

КонтекстПримерЧто делает
Определение функцииdef f(*args, **kwargs):собирает лишние аргументы
Вызов функцииf(*values, **mapping)распаковывает коллекцию в аргументы
Литерал коллекции (глава 11)[*a, *b]объединяет коллекции
Один символ, разный смысл в зависимости от контекста
* и ** не означают везде буквально одну и ту же операцию — их роль зависит от того, где они стоят: в определении функции, в вызове или в литерале коллекции.
Практика: *args, **kwargs и распаковка при вызове
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Открыть практику →