Почему «if not a: = say_empty()» вызывает ошибку SyntaxError?

PEP 572 вводит оператор присваивания («оператор моржа»).

Следующий код работает и выводит empty

      def say_empty():
    return ''

if a := say_empty():
    print("not empty")
else:
    print("empty")

Я попытался отрицать условие:

      def say_empty():
    return ''

if not a := say_empty():
    print("empty")
else:
    print("not empty")

Это вызывает

          if not a := say_empty():
       ^
SyntaxError: cannot use assignment expressions with operator

Данная ошибка очевидна, однако мне интересно, почему было введено это ограничение.

PEP 572 объясняет, почему использование присваивания в итерациях проблематично (и повышает SyntaxError), но про булевы ничего не нашел.

1 ответ

Решение

Приоритет оператора указывает, что := имеет более низкий приоритет, чем not. Так not a := читается как попытка назначить not a, отсюда и синтаксическая ошибка.

Вы можете использовать круглые скобки, чтобы пояснить значение:

      if not (a := say_empty()):
    ...
Другие вопросы по тегам