Следующий код
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».
Распаковка без скобок не разрешалась до версии 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 Полагаю, более точная версия моего вопроса была бы такой: «Где задокументировано это изменение?» Я посмотрю ссылки.
Также интересно, из вопроса на гитхабе Ruff linter: github.com/astral-sh/ruff/issues/2321






Это было следствием грамматических изменений в 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.
Я знал Я видел это раньше!
о боже, я помню, что с этим было что-то связанное, вероятно, после выхода нового парсера PEG. хотя я не могу его найти