mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-01 06:11:43 +00:00

## Summary This change adds an auto-fix for manual dict comprehensions. It also copies many of the improvements from #13919 (and associated PRs fixing issues with it), and moves some of the utility functions from `manual_list_comprehension.rs` into a separate `helpers.rs` to be used in both. ## Test Plan I added a preview test case to showcase the new fix and added a test case in `PERF403.py` to make sure lines with semicolons function. I didn't yet make similar tests to the ones I added earlier to `PERF401.py`, but the logic is the same, so it might be good to add those to make sure they work.
153 lines
3.3 KiB
Python
153 lines
3.3 KiB
Python
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {}
|
|
for idx, name in enumerate(fruit):
|
|
result[idx] = name # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {}
|
|
for idx, name in enumerate(fruit):
|
|
if idx % 2:
|
|
result[idx] = name # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {}
|
|
for idx, name in enumerate(fruit):
|
|
if idx % 2:
|
|
result[idx] = (
|
|
name # Ok (false negative: edge case where `else` is same as `if`)
|
|
)
|
|
else:
|
|
result[idx] = name
|
|
|
|
|
|
def foo():
|
|
result = {}
|
|
fruit = ["apple", "pear", "orange"]
|
|
for idx, name in enumerate(fruit):
|
|
if idx % 2:
|
|
result[idx] = name # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = []
|
|
for idx, name in enumerate(fruit):
|
|
if idx % 2:
|
|
result[idx] = name # OK (result is not a dictionary)
|
|
else:
|
|
result[idx] = name
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {}
|
|
for idx, name in enumerate(fruit):
|
|
if idx % 2:
|
|
result[idx] = name # OK (if/elif/else isn't replaceable)
|
|
elif idx % 3:
|
|
result[idx] = name
|
|
else:
|
|
result[idx] = name
|
|
|
|
|
|
def foo():
|
|
result = {1: "banana"}
|
|
fruit = ["apple", "pear", "orange"]
|
|
for idx, name in enumerate(fruit):
|
|
if idx % 2:
|
|
result[idx] = name # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {}
|
|
for idx, name in enumerate(fruit):
|
|
if idx in result:
|
|
result[idx] = name # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {}
|
|
for name in fruit:
|
|
result[name] = name # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {}
|
|
for idx, name in enumerate(fruit):
|
|
result[name] = idx # PERF403
|
|
|
|
|
|
def foo():
|
|
from builtins import dict as SneakyDict
|
|
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = SneakyDict()
|
|
for idx, name in enumerate(fruit):
|
|
result[name] = idx # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result: dict[str, int] = {
|
|
# comment 1
|
|
}
|
|
for idx, name in enumerate(
|
|
fruit # comment 2
|
|
):
|
|
# comment 3
|
|
result[
|
|
name # comment 4
|
|
] = idx # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
a = 1; result = {}; b = 2
|
|
for idx, name in enumerate(fruit):
|
|
result[name] = idx # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {"kiwi": 3}
|
|
for idx, name in enumerate(fruit):
|
|
result[name] = idx # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
(_, result) = (None, {"kiwi": 3})
|
|
for idx, name in enumerate(fruit):
|
|
result[name] = idx # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {}
|
|
print(len(result))
|
|
for idx, name in enumerate(fruit):
|
|
result[name] = idx # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
result = {}
|
|
for idx, name in enumerate(fruit):
|
|
if last_idx := idx % 3:
|
|
result[name] = idx # PERF403
|
|
|
|
|
|
def foo():
|
|
fruit = ["apple", "pear", "orange"]
|
|
indices = [0, 1, 2]
|
|
result = {}
|
|
for idx, name in indices, fruit:
|
|
result[name] = idx # PERF403
|