Почему «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()):
...