ruff/crates/ruff_linter/resources/test/fixtures/perflint/PERF403.py
w0nder1ng 08221454f6
[perflint] Implement fix for manual-dict-comprehension (PERF403) (#16719)
## 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.
2025-04-18 13:10:40 -04:00

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