多个和/或表达式

Vai*_*pai 1 python

foo() 没有定义.

>>> 0 and foo()                   (1)
0                                     # trivial 

>>> 0 and foo() or 1              (2) # expecting it as 0 and (foo() or 1)
1                                     # does NOT short-circuit on 0

>>> 1 or foo()                    (3) # trivial
1

>>> 1 or foo() and 0              (4) # expecting it as 1 or (foo() and 0)
1                                     # DOES short-circuit on 1
Run Code Online (Sandbox Code Playgroud)

我没有看到(2)和(4)的一致行为.

情况1

如果我们按(2)的评估方式去:

0 and foo() or 1
false or true (1)
true (1)
Run Code Online (Sandbox Code Playgroud)

然后我希望(4)为:

1 or foo() and 0
true and false (0)
false (0)
Run Code Online (Sandbox Code Playgroud)

案例2

如果我们按(4)的评价方式去:

1 or foo() and 0
true or ...
true (1)
Run Code Online (Sandbox Code Playgroud)

然后我希望(2)为:

0 and foo() or 1
false and ...
false (0)
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 5

and优先级高于or.

(2)

0 and foo() or 1 == (0 and foo()) or 1
                 == 0 or 1  # short-circuited, foo() never evaluated
                 == 1
Run Code Online (Sandbox Code Playgroud)

(4)

1 or foo() and 0 == 1 or (foo() and 0)
                 == 1       # short-circuited, foo() never evaluated
Run Code Online (Sandbox Code Playgroud)