-
-
Notifications
You must be signed in to change notification settings - Fork 54
/
use_or.py
45 lines (30 loc) · 985 Bytes
/
use_or.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
from dataclasses import dataclass
from mypy.nodes import ConditionalExpr
from refurb.checks.common import is_equivalent, stringify
from refurb.error import Error
@dataclass
class ErrorInfo(Error):
"""
Sometimes the ternary operator (aka, inline if statements) can be
simplified to a single `or` expression.
Bad:
```
z = x if x else y
```
Good:
```
z = x or y
```
Note: if `x` depends on side-effects, then this check should be ignored.
"""
name = "use-or-oper"
code = 110
categories = ("logical", "readability")
def check(node: ConditionalExpr, errors: list[Error]) -> None:
if is_equivalent(node.if_expr, node.cond):
if_true = stringify(node.if_expr)
if_false = stringify(node.else_expr)
old = f"{if_true} if {if_true} else {if_false}"
new = f"{if_true} or {if_false}"
msg = f"Replace `{old}` with `{new}`"
errors.append(ErrorInfo.from_node(node, msg))