Это не оператор как таковые, так что это не на самом деле есть имя, но оно определяется как «синтаксическое правило» . Так и должно называться:
- "синтаксис распаковки аргумента ключевого слова"
Если у вас есть список аргументов, *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
является «переменным ключевым словом параметра». Аргументы только для ключевого слова не могут быть заданы позиционно, поскольку переменный позиционный параметр будет принимать все передаваемые вами аргументы.
Большая часть этого может быть найдена в PEP 0362 и 3102 , а также в разделе « Поток управления» документов. Однако следует отметить, что объект сигнатуры функции 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]: Iterables - это объекты, которые реализуют __iter__()
метод, а отображения - это объекты, которые реализуют keys()
и __getitem__()
. Любой объект, который поддерживает этот протокол, будет понят конструкторам tuple()
и dict()
, следовательно, их можно использовать для распаковки аргументов.