Почему распаковка списка при индексации является синтаксической ошибкой в ​​Python 3.8, но не в Python 3.12?

Следующий код

import numpy as np
x = np.arange(32).reshape(2,2,2,2,2)
extra = [1 for _ in range(3)]
print(x[*extra, 0, 0])

печатает 28, как и ожидалось в Python 3.12, но приводит к синтаксической ошибке

  File "main.py", line 4
    print(x[*extra, 0, 0])
            ^
SyntaxError: invalid syntax

в Python 3.8.

Замена индексации на print(x[(*extra, 0, 0)]) работает в обеих версиях.

В документации NumPy указано, что строка, вызывающая нарушение, является синтаксическим сахаром для рабочей, поэтому я не понимаю, почему возникает синтаксическая ошибка.

Быстрый поиск по терминам «unpack», «index» и «getitem» для версий с 3.9 по 3.12 (включительно) на https://docs.python.org/3/whatsnew/index.html не дал результатов. Никаких признаков того, что синтаксис индексации или распаковки был изменен, я не обнаружил, хотя, возможно, я что-то пропустил. Самое близкое, что я нашел, это то, что в Python 3.11 есть изменение: «Выражения распаковки со звездочкой теперь можно использовать в операторах for».

о боже, я помню, что с этим было что-то связанное, вероятно, после выхода нового парсера PEG. хотя я не могу его найти

juanpa.arrivillaga 29.05.2024 23:24

Распаковка без скобок не разрешалась до версии 3.9, но полностью не поддерживалась до версии 3.11. Если вы просмотрите некоторые проблемы cpython git, вы можете отследить их, если вам действительно интересно. Функции/функциональность регулярно меняются между версиями, поэтому я не уверен, почему/что вы спрашиваете. [github.com/python/cpython/issues/90881 , github.com/astral-sh/ruff/issues/2321] . Вы можете начать трассировку в разделе «Другие изменения языка», ссылка: bpo-46725: docs.python.org/3/whatsnew/3.11.html

scrappedcola 29.05.2024 23:25

@scrappedcola Полагаю, более точная версия моего вопроса была бы такой: «Где задокументировано это изменение?» Я посмотрю ссылки.

D. Song 29.05.2024 23:32
github.com/python/cpython/issues/90881 похоже, что это могло проникнуть в парсер PEG и задним числом стало функцией :)
juanpa.arrivillaga 29.05.2024 23:32

Также интересно, из вопроса на гитхабе Ruff linter: github.com/astral-sh/ruff/issues/2321

juanpa.arrivillaga 29.05.2024 23:35
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
5
110
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это было следствием грамматических изменений в PEP 646 – Variadic Generics и почему-то не было упомянуто в журнале изменений версии 3.11.

Минимальный воспроизводитель:

$ python3.11 -c 'print({():42}[*()])'
42
$ python3.10 -c 'print({():42}[*()])'
  File "<string>", line 1
    print({():42}[*()])
          ^^^^^^^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

Соответствующие различия можно найти по адресу #31018: Внедрить изменения грамматики PEP 646.

ахххх вот это было! Я знал, что это было специально упомянуто в каком-то PEP.

juanpa.arrivillaga 29.05.2024 23:42

Я знал Я видел это раньше!

wjandrea 29.05.2024 23:45

Другие вопросы по теме