В чем заключается синтаксическая ошибка этого условного выражения?

Я получил:

  return r.group() if r := re.match(rx,l) else None
                      ^

SyntaxError: неверный синтаксис

тогда как

        return r.group() if (r := re.match(rx,l)) else None

принято.

Что недопустимо в синтаксисе первого? А какое еще толкование, кроме второго, такое, чтобы оно не было однозначным?

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

См. таблицу приоритета операторов — используя скобки для выделения приоритета, первое выражение:

return r.group() if (r := (re.match(rx,l) else None))
                           ^^^^^^^^^^^^^^^^^^^^^^^^

Очевидно, что это скорее синтаксическая ошибка, чем двусмысленность, но интерпретатор Python не может просто свободно переопределить приоритет, чтобы выбрать интерпретацию, которая имеет смысл.

Это не результат выбора приоритета. Природа on_true if cond else on_false такова, что условная часть выражения по своей сути однозначна; к тому времени, когда вы увидите if, вы знаете, что находитесь в условной части, которую можно закончить только с помощью else (C cond ? on_true : on_false аналогична, где часть on_true ограничена достаточно хорошо, чтобы вы могли делать некоторые вещи там, не беспокоясь о скобках для приоритета, которые не будут работать в частях cond или on_false). Python намеренно решил сделать моржей без скобок незаконными.

ShadowRanger 04.06.2024 02:56

Приоритет операторов вступает в игру только тогда, когда структура уже определена как синтаксически допустимая и существует семантическая неоднозначность. Он никогда не сможет сделать структуру синтаксически недействительной.

Weijun Zhou 04.06.2024 03:17

Я думаю, что синтаксический анализ не поддерживается этой таблицей приоритета операторов, потому что, хотя таблица имеет if – else предшествовавший :=, сама по себе она не имеет else предшествующего :=.

ChrisJJ 04.06.2024 13:03
Ответ принят как подходящий

Ограничение допустимых мест, в которых может использоваться оператор моржа («выражение присваивания» для тех, кто убил своего внутреннего ребенка), было в основном выборным. Они не хотели, чтобы он заменял = для присваивания или привыкал постоянно сжимать несколько строк кода в одну ради развлечения, поэтому они наложили ограничения на его синтаксис, которые делают его неудобным за пределами случаев, для которых он действительно был разработан. . Самым большим ограничением было то, что они требовали скобки в тех случаях, когда в этом нет особой необходимости (например, наиболее очевидным случаем является то, что язык мог тривиально реализовать это так, чтобы x := 1 сам по себе работал, но решил не делать этого).

Спецификация грамматики языка описывает точные правила (выделено нами):

Выражения присваивания должны быть заключены в круглые скобки при использовании в качестве операторов выражения и при использовании в качестве подвыражений в выражениях среза, условных, лямбда-выражениях, выражениях с ключевым словом-аргументом и понимании-если, а также в выражениях assert, with и assignment. Во всех остальных местах, где их можно использовать, скобки не требуются, в том числе в операторах if и while.

По сути, моржи без скобок по определению несовместимы с условными выражениями, потому что так сказали разработчики языка Python.

Спасибо за это отличное объяснение. «в основном преднамеренная вещь». Попался. для меня это частично случайно. :)

ChrisJJ 04.06.2024 13:05

«Они накладывают ограничения на его синтаксис, которые делают его неудобным за пределами случаев, для которых он действительно был разработан». Попался. Я думаю, мы должны быть благодарны, что они не просто записали это :)

ChrisJJ 04.06.2024 13:08

@ChrisJJ: Я не собираюсь говорить, что что-то из этого было случайностью (непреднамеренные части - это случаи, когда действительно были проблемы, которые требовали скобок, чтобы избежать двусмысленности в грамматике, или технически однозначное, но чрезвычайно запутанное поведение) . Но, конечно, вы воспринимаете это как хотите. :-)

ShadowRanger 04.06.2024 13:12

«Я не собираюсь говорить, что это был несчастный случай». Хорошо. Я соглашусь на ваше «непреднамеренное» :) «(непреднамеренные части — это случаи, когда действительно были проблемы, которые требовали скобок, чтобы избежать двусмысленности в грамматике». Думаю, мы никогда не узнаем, почему эти законные случаи заслуживали меньшего внимания, чем дела о «развлечениях».

ChrisJJ 04.06.2024 13:22

@ChrisJJ: Решил перейти от «намеренного» (что, как вы говорите, происходит практически автоматически, если только они не плохо справляются со своей работой) на «выборное»; они могли бы сделать это законным во многих других контекстах, иногда с меньшими усилиями, чем разрешить это, и решили явно запретить это во многих из них.

ShadowRanger 14.06.2024 21:12

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