Глава 13 · Автоматизация с помощью функций
*args, **kwargs и распаковка
*args собирает лишние позиционные аргументы в кортеж, **kwargs — лишние именованные в словарь. Те же символы на месте вызова распаковывают коллекцию обратно в аргументы.
*args — произвольное число позиционных аргументов
args_povtorenie.py
def total(*numbers):
return sum(numbers)
total(1, 2, 3, 4)
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 — ключ - имя аргумента, значение - переданное значение.*args vs **kwargs
vyzov_s_oboimi.py
func(10, 20, color="red", size=3)
| *args | **kwargs | |
|---|---|---|
| Собирает | лишние позиционные аргументы | лишние именованные аргументы |
| Тип внутри функции | tuple | dict |
| В примере выше | (10, 20) | {'color': 'red', 'size': 3} |
Распаковка аргументов на месте вызова
Тот же символ */**, но теперь на
стороне ВЫЗОВА, а не определения — связываем с распаковкой из главы 11:
raspakovka_pri_vyzove.py
point = (10, 20)
move(*point) # эквивалентно 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, без установки