records
- это кортеж -> ('foo', 1, 2)
Цикл for использует несколько итерационных переменных tag, *args
. Это означает, что кортеж распакован, т. Е. Разложен на составляющие.
tag
-> запрашивает один элемент из этого кортежа, он получает foo
.
*args
-> запрашивает все остальные элементы из кортежа - как кортеж. Это получает (1,2)
: это упаковка
Теперь do_foo(x,y)
- нормальная функция. это называется так do_foo(*args)
.
Помните, что args
сейчас (1,2)
.
*args
-> *(1,2)
-> 1,2
: кортеж распакован - из-за *
. Выражение заканчивается как do_foo(1,2)
- что соответствует сигнатуре нашей функции!
В итоге, в цикле for tag, *args
для присвоения используется *args
, который упаковывает вещи в кортеж. В вызове функции *args
используется в качестве аргумента - что распаковывает вещи в аргументы вызова функции.