Як називається ** у python?


59

При програмуванні Python я іноді роблю a, **щоб зробити перетворення. Я розумію, що це робить, але якими структурами даних я маніпулюю? А dictа що інше? А array? Чи є ім’я для **оператора?


3
експоненціальний оператор?
Грак

12
Існує два значення для **. Потужність та "словник аргументів ключових слів". Про кого ти говориш? У документації є такі слова: "Якщо форма" ** ідентифікатор "присутня, вона ініціалізується до нового словника, отримуючи зайві аргументи ключових слів, за замовчуванням до нового порожнього словника." Які з них здаються актуальними для вашого питання?
С.Лотт

"Словник аргументів ключових слів" був про мене про це. Дякую за коментарі.
Ніклас Розенкранц

Відповіді:


86

Це не оператор як такі, так що це НЕ на насправді є ім'я, але воно визначається як «синтаксичне правило» . Тому його слід називати:

  • "синтаксис розпакування аргументу ключового слова"

Якщо у вас є список аргументів, *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()тому їх можна використовувати для розпакування аргументів.


3
У випадку, якщо хтось інший плутається, 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 обробляє оригінальний синтаксис як очікувалося.
chbrown

1
Поки ми в цьому: begin, *middle, end = (0, 1, 2, 3, 4, 5)синтаксис також не працює в Python 2.x.
Стефано Палацо

Ця відповідь невірна в Python 3.5 та пізніших версіях. PEP-448 визначає оператора ** як оператора розпакування словника. Дивіться python.org/dev/peps/pep-0448
devnul3

13

Я не думаю, що це ім’я. У Документах Python у розділі "Розпакування списків аргументів" його просто називають " **оператором".

Я не впевнений, що ви маєте на увазі під структурою даних "інша". Коли ви f(**kwargs)розпаковуєте словник, kwargsяк послідовність пар ключових значень. Я не бачу, що тут задіяна інша структура.

Я скопію приклад у вищевказану документацію для наочності.

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

Дивіться також: Що означає * args та ** kwargs?


Є кілька можливих способів, як читач може інтерпретувати f(**kwargs)...
Мисливець на оленів

3

Якщо ви не впевнені, як зателефонувати конкретному оператору або якщо він не названий, ви завжди можете звернутися до Waka Waka Bang Splat як еталон, який допоможе вам зрозуміти, як його зателефонувати. У цьому випадку для цього **я б назвав це double-splat, хоча є деякі альтернативні назви символів .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.