При программировании на Python я иногда делаю **
конверсию. Я понимаю, что он делает, но какими структурами данных я манипулирую? А dict
какой другой? array
? Есть ли название для **
оператора?
python
operators
type-conversion
Никлас Розенкранц
источник
источник
**
. Мощность и «словарь аргумента ключевого слова». О чем ты говоришь? В документации есть следующие слова: «Если присутствует форма« ** идентификатор », она инициализируется новым словарем, получающим любые лишние аргументы ключевого слова, по умолчанию новым пустым словарем». Какие из них кажутся актуальными для вашего вопроса?Ответы:
Это не оператор как таковые, так что это не на самом деле есть имя, но оно определяется как «синтаксическое правило» . Так и должно называться:
Если у вас есть список аргументов,
*args
это называется «распаковка аргумента» , таким же образом**kwargs
называется «распаковка аргумента ключевого слова» .Если вы используете его с левой стороны
=
, как, напримерa, *middle, end = my_tuple
, вы бы сказали «распаковка кортежей» .Всего существует три типа аргументов (с одним параметром):
*args
Аргумент называется «переменным позиционным параметром» и**kwargs
является «переменным ключевым словом параметра». Аргументы только для ключевого слова не могут быть заданы позиционно, поскольку переменный позиционный параметр будет принимать все передаваемые вами аргументы.Большая часть этого может быть найдена в PEP 0362 и 3102 , а также в разделе « Поток управления» документов. Однако следует отметить, что объект сигнатуры функции PEP является всего лишь черновиком, и терминология может быть просто идеей одного человека. Но они все равно хорошие условия. :)
Таким образом,
*
и**
аргументы , просто распакуйте их соответствующие структуры данных:[1]: Iterables - это объекты, которые реализуют
__iter__()
метод, а отображения - это объекты, которые реализуютkeys()
и__getitem__()
. Любой объект, который поддерживает этот протокол, будет понят конструкторамtuple()
иdict()
, следовательно, их можно использовать для распаковки аргументов.источник
def f(x, *xs, y=0): pass
недопустим синтаксис Python 2. {5,6,7}, и он неdef f(x, y=0, *xs):
выполняет то, что вы ожидаете. AFAIK, единственный способ достичь (очевидно) предполагаемого эффектаdef f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...
. Python 3 обрабатывает оригинальный синтаксис, как и ожидалось.begin, *middle, end = (0, 1, 2, 3, 4, 5)
синтаксис не работает и в Python 2.x.Я не думаю, что у него есть имя. В Python Docs в разделе «Распаковка списков аргументов» это просто упоминается как «
**
-оператор».Я не уверен, что вы подразумеваете под "другой" структурой данных. Когда вы
f(**kwargs)
распаковываете словарьkwargs
как последовательность пар ключ-значение. Я не вижу, чтобы была задействована другая структура.Я скопирую пример в вышеупомянутой документации для ясности.
Смотрите также: Что означают * args и ** kwargs?
источник
f(**kwargs)
...Если вы не знаете, как позвонить конкретному оператору или если он не назван, вы всегда можете обратиться к Waka Waka Bang Splat в качестве справки, чтобы помочь вам понять, как его назвать. В этом случае
**
я бы назвал этоdouble-splat
, хотя есть несколько альтернативных имен для символов .источник