Подтвердить что ты не робот

Где работают операторы python splat * и **?

Операторы распаковки /splat * и ** сильно различаются по их применимости в версиях python (2.7, 3.x < 3.5 и 3.x >= 3.5).

Например:

                                   |   2.7    |   3.1-3.4  |   3.5   
----------------------------------------------------------------------
function(*args)                         ✓            ✓          ✓    

x, *y, z = [1, 2, 3, 4, 5]              x            ✓          ✓    

{**x, **y}                              x            x          ✓    

Есть ли больше несоответствий между различными версиями, которые я пропустил? Я просматриваю PEP и Readmes, но документы не детализированы с этим.

4b9b3361

Ответ 1

Примерно в 1992 году (не уверен в версии Python). Это из файла грамматики Python 1.0.1.

# 06-Apr-92:
#   Use only '*' for varargs list

# 31-Mar-92:
#   Tighten syntax for try statements

# 27-Feb-92:
#   Allow NEWLINE* after eval input

# 16-Jan-92:
#   Added '*' as alternative for '+' in varargs syntax
#   (Not sure which alternative is better yet.)

# 11-Jan-92:
#   Variable length argument list syntax added: def f(a, b, +rest): ...

Python 1.4+:

Аргументы ключевого слова. Функции и методы, написанные на Python, теперь могут быть вызывается с использованием аргументов ключевого слова формы keyword = value.

Python 1.6+

Теперь есть специальный синтаксис, который вы можете использовать вместо apply()функция. f(*args, **kwds) эквивалентно apply(f, args, kwds). Вы также можно использовать вариации f(a1, a2, *args, **kwds), и вы можете оставить один или другой: f(*args), f(**kwds).

Python <= 2.7:

В Python 3.0 была удалена распаковка параметра Tuple.

PEP 3113: Параметр Tuple распаковка удалена. Вы больше не можете писать def foo(a, (b, c)): .... Вместо этого используйте def foo(a, b_c): b, c = b_c.

Python 3.0+

PEP 3132: Extended Iterable Распаковка. Теперь вы можете писать такие вещи, как a, b, *rest = some_sequence. И даже *rest, a = stuff. Остальной объект всегда a (возможно, пустой) список; правая часть может быть любым итерируемым.

PEP 3102: Аргументы только для ключевого слова. Именованные параметры, возникающие после *args в списке параметров должен быть указан с использованием синтаксиса ключевых слов в вызове. Вы также можете использовать голый * в списке параметров, чтобы указать что вы не принимаете список аргументов переменной длины, но у вас есть аргументы только для ключевого слова

Python 3.5+

PEP 448, дополнительный распаковка обобщений.


Насколько я знаю, нет единственной страницы, в которой перечислены все изменения синтаксиса. За изменения синтаксиса версии перечислены в разделе What new in Python или вы можете проверить спецификацию грамматики каждой версии, чтобы увидеть различия.