TL; DR
Она упаковывает аргументы, переданные функции, в list
и dict
соответственно внутри тела функции. Когда вы определяете сигнатуру функции следующим образом:
def func(*args, **kwds):
# do stuff
он может быть вызван с любым количеством аргументов и аргументов ключевого слова. Аргументы без ключевых слов упаковываются в список с именем args
внутри тела функции, а аргументы с ключевыми словами упаковываются в dict с именем kwds
внутри тела функции.
func("this", "is a list of", "non-keyowrd", "arguments", keyword="ligma", options=[1,2,3])
теперь внутри тела функции, когда вызывается функция, есть две локальные переменные, args
, представляющий собой список со значением ["this", "is a list of", "non-keyword", "arguments"]
, и kwds
, представляющий собой dict
, имеющий значение {"keyword" : "ligma", "options" : [1,2,3]}
Это также работает в обратном порядке, то есть со стороны вызывающего абонента. например, если у вас есть функция, определенная как:
def f(a, b, c, d=1, e=10):
# do stuff
вы можете вызвать его, распаковав итерации или сопоставления, которые есть в области вызова:
iterable = [1, 20, 500]
mapping = {"d" : 100, "e": 3}
f(*iterable, **mapping)
# That call is equivalent to
f(1, 20, 500, d=100, e=3)