Це не оператор як такі, так що це НЕ на насправді є ім'я, але воно визначається як «синтаксичне правило» . Тому його слід називати:
- "синтаксис розпакування аргументу ключового слова"
Якщо у вас є список аргументів, *args
він називається "розпакування аргументу" , таким же чином **kwargs
називається "розпакування аргументу ключових слів" .
Якщо ви використовуєте його з лівого боку =
, як a, *middle, end = my_tuple
, наприклад, ви скажете "розпакування кортежу" .
Всього існує три типи (одного параметра) аргументів:
def f(x) # x: positional argument
def f(x, y=0) # y: keyword argument
def f(x, *xs, y=0) # y: keyword-only argument
*args
Аргумент називається «змінним позиційним параметром» і **kwargs
є «змінним параметром ключового слова». Аргументи, що стосуються лише ключових слів, не можна наводити позиційно, оскільки змінна позиційна параметр буде приймати всі передані вами аргументи.
Більшу частину цього можна знайти в PEPs 0362 та 3102 , а також у розділі « Control Flow» в документах. Слід зазначити, що PEP-об'єкт підпису функції - це лише чернетка, а термінологія може бути лише ідеєю однієї людини. Але вони все одно хороші. :)
Таким чином, *
і **
аргументи просто розпаковують відповідні структури даних:
args = (1, 2, 3) # usually a tuple, always an iterable[1]
f(*args) → f(1, 2, 3)
# and
kwargs = {"a": 1, "b": 2, "c": 3} # usually a dict, always a mapping*
f(**kwargs) -> f(a=1, b=2, c=3)
[1]: Ітерабелі - це об'єкти, які реалізують __iter__()
метод, а відображення - це об'єкти, які реалізують keys()
та __getitem__()
. Будь-який об'єкт, який підтримує цей протокол, буде зрозумілий конструкторам, tuple()
і dict()
тому їх можна використовувати для розпакування аргументів.