@@ -128,28 +128,31 @@ def infer_condition_value(expr: Expression, options: Options) -> int:
128
128
elif isinstance (expr , MemberExpr ):
129
129
name = expr .name
130
130
elif isinstance (expr , OpExpr ) and expr .op in ("and" , "or" ):
131
- # This is a bit frivolous with MYPY_* vs ALWAYS_* returns: for example, here
132
- # `MYPY_TRUE or ALWAYS_TRUE` will be `MYPY_TRUE`, while
133
- # `ALWAYS_TRUE or MYPY_TRUE` will be `ALWAYS_TRUE`. This literally never
134
- # makes any difference in consuming code, so short-circuiting here is probably
135
- # good enough as it allows referencing platform-dependent variables in
136
- # statement parts that will not be executed.
131
+ if expr .op not in ("or" , "and" ):
132
+ return TRUTH_VALUE_UNKNOWN
133
+
137
134
left = infer_condition_value (expr .left , options )
138
- if (left in (ALWAYS_TRUE , MYPY_TRUE ) and expr .op == "or" ) or (
139
- left in (ALWAYS_FALSE , MYPY_FALSE ) and expr .op == "and"
140
- ):
141
- # Either `True or <other>` or `False and <other>`: `<other>` doesn't matter
142
- return left
143
135
right = infer_condition_value (expr .right , options )
144
- if (right in (ALWAYS_TRUE , MYPY_TRUE ) and expr .op == "or" ) or (
145
- right in (ALWAYS_FALSE , MYPY_FALSE ) and expr .op == "and"
146
- ):
147
- # Either `<other> or True` or `<other> and False`: `<other>` doesn't matter
148
- return right
149
- # Now we have `True and True`, `False or False` or smth indeterminate.
150
- if TRUTH_VALUE_UNKNOWN in (left , right ) or expr .op not in ("or" , "and" ):
151
- return TRUTH_VALUE_UNKNOWN
152
- return left
136
+ results = {left , right }
137
+ if expr .op == "or" :
138
+ if ALWAYS_TRUE in results :
139
+ return ALWAYS_TRUE
140
+ elif MYPY_TRUE in results :
141
+ return MYPY_TRUE
142
+ elif left == right == MYPY_FALSE :
143
+ return MYPY_FALSE
144
+ elif results <= {ALWAYS_FALSE , MYPY_FALSE }:
145
+ return ALWAYS_FALSE
146
+ elif expr .op == "and" :
147
+ if ALWAYS_FALSE in results :
148
+ return ALWAYS_FALSE
149
+ elif MYPY_FALSE in results :
150
+ return MYPY_FALSE
151
+ elif left == right == ALWAYS_TRUE :
152
+ return ALWAYS_TRUE
153
+ elif results <= {ALWAYS_TRUE , MYPY_TRUE }:
154
+ return MYPY_TRUE
155
+ return TRUTH_VALUE_UNKNOWN
153
156
else :
154
157
result = consider_sys_version_info (expr , pyversion )
155
158
if result == TRUTH_VALUE_UNKNOWN :
0 commit comments