ruff/crates/ruff_linter/resources/test/fixtures/flake8_simplify/SIM108.py
Dylan 0c2b88f224
[flake8-simplify] Further simplify to binary in preview for if-else-block-instead-of-if-exp (SIM108) (#12796)
In most cases we should suggest a ternary operator, but there are three
edge cases where a binary operator is more appropriate.

Given an if-else block of the form

```python
if test:
    target_var = body_value
else:
    target_var = else_value
```
This PR updates the check for SIM108 to the following:

- If `test == body_value` and preview enabled, suggest to replace with
`target_var = test or else_value`
- If `test == not body_value` and preview enabled, suggest to replace
with `target_var = body_value and else_value`
- If `not test == body_value` and preview enabled, suggest to replace
with `target_var = body_value and else_value`
- Otherwise, suggest to replace with `target_var = body_value if test
else else_value`

Closes #12189.
2024-08-10 16:49:25 +00:00

196 lines
2.8 KiB
Python

# SIM108
if a:
b = c
else:
b = d
# OK
b = c if a else d
# OK
if a:
b = c
elif c:
b = a
else:
b = d
# OK
if True:
pass
elif a:
b = 1
else:
b = 2
# SIM108
if True:
pass
else:
if a:
b = 1
else:
b = 2
import sys
# OK
if sys.version_info >= (3, 9):
randbytes = random.randbytes
else:
randbytes = _get_random_bytes
# OK
if sys.platform == "darwin":
randbytes = random.randbytes
else:
randbytes = _get_random_bytes
# OK
if sys.platform.startswith("linux"):
randbytes = random.randbytes
else:
randbytes = _get_random_bytes
# SIM108 (without fix due to comments)
if x > 0:
# test test
abc = x
else:
# test test test
abc = -x
# OK (too long)
if parser.errno == BAD_FIRST_LINE:
req = wrappers.Request(sock, server=self._server)
else:
req = wrappers.Request(
sock,
parser.get_method(),
parser.get_scheme() or _scheme,
parser.get_path(),
parser.get_version(),
parser.get_query_string(),
server=self._server,
)
# SIM108
if a:
b = "cccccccccccccccccccccccccccccccccß"
else:
b = "ddddddddddddddddddddddddddddddddd💣"
# OK (too long)
if True:
if a:
b = ccccccccccccccccccccccccccccccccccc
else:
b = ddddddddddddddddddddddddddddddddddd
# OK (too long with tabs)
if True:
if a:
b = ccccccccccccccccccccccccccccccccccc
else:
b = ddddddddddddddddddddddddddddddddddd
# SIM108 (without fix due to trailing comment)
if True:
exitcode = 0
else:
exitcode = 1 # Trailing comment
# SIM108
if True: x = 3 # Foo
else: x = 5
# SIM108
if True: # Foo
x = 3
else:
x = 5
# OK
def f():
if True:
x = yield 3
else:
x = yield 5
from typing import TYPE_CHECKING
# OK
if TYPE_CHECKING:
x = 3
else:
x = 5
# SIM108 - should suggest
# z = cond or other_cond
if cond:
z = cond
else:
z = other_cond
# SIM108 - should suggest
# z = cond and other_cond
if not cond:
z = cond
else:
z = other_cond
# SIM108 - should suggest
# z = not cond and other_cond
if cond:
z = not cond
else:
z = other_cond
# SIM108 does not suggest
# a binary option in these cases,
# despite the fact that `bool`
# is a subclass of both `int` and `float`
# so, e.g. `True == 1`.
# (Of course, these specific expressions
# should be simplified for other reasons...)
if True:
z = 1
else:
z = other
if False:
z = 1
else:
z = other
if 1:
z = True
else:
z = other
# SIM108 does not suggest a binary option in this
# case, since we'd be reducing the number of calls
# from Two to one.
if foo():
z = foo()
else:
z = other
# SIM108 does not suggest a binary option in this
# case, since we'd be reducing the number of calls
# from Two to one.
if foo():
z = not foo()
else:
z = other