10

PEP 572 introduces the assignement operator ("walrus operator").

The following code works, and outputs empty

def say_empty():
    return ''

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

I tried to negate the condition:

def say_empty():
    return ''

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

This raises a SyntaxError

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

The given error is clear, I am however wondering why this limitation was put in place.

PEP 572 explains why using the assignment in iterations is problematic (and raises SyntaxError), but I did not find anything about boolean ones.

WoJ
  • 27,165
  • 48
  • 180
  • 345

1 Answers1

19

Operator precedence indicates that := has a lower precedence than not. So not a := is read as trying to assign to not a, hence the syntax error.

You can use parentheses to clarify the meaning:

if not (a := say_empty()):
    ...
khelwood
  • 55,782
  • 14
  • 81
  • 108