为什么“if not a := say_empty()”会引发语法错误?

WoJ*_*WoJ 12 python python-3.x walrus-operator

PEP 572引入了赋值运算符(“海象运算符”)。

以下代码有效并输出empty

def say_empty():
    return ''

if a := say_empty():
    print("not empty")
else:
    print("empty")
Run Code Online (Sandbox Code Playgroud)

我试图否定这个条件:

def say_empty():
    return ''

if not a := say_empty():
    print("empty")
else:
    print("not empty")
Run Code Online (Sandbox Code Playgroud)

这就提出了一个SyntaxError

    if not a := say_empty():
       ^
SyntaxError: cannot use assignment expressions with operator
Run Code Online (Sandbox Code Playgroud)

给定的错误很明显,但是我想知道为什么要实施此限制。

PEP 572 解释了为什么在迭代中使用赋值会出现问题(并引发SyntaxError),但我没有找到任何有关布尔值的信息。

khe*_*ood 22

运算符优先级表示 的:=优先级低于not。Sonot a :=被解读为尝试分配给not a,因此出现语法错误。

您可以使用括号来阐明含义:

if not (a := say_empty()):
    ...
Run Code Online (Sandbox Code Playgroud)