mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-27 20:42:10 +00:00
Use set bracket replacement for iteration-over-set
(#8001)
This commit is contained in:
parent
73049df3ed
commit
cb6d74c27b
3 changed files with 128 additions and 77 deletions
|
@ -6,6 +6,14 @@ for item in {1}:
|
||||||
for item in {"apples", "lemons", "water"}: # flags in-line set literals
|
for item in {"apples", "lemons", "water"}: # flags in-line set literals
|
||||||
print(f"I like {item}.")
|
print(f"I like {item}.")
|
||||||
|
|
||||||
|
for item in {1,}:
|
||||||
|
print(f"I can count to {item}!")
|
||||||
|
|
||||||
|
for item in {
|
||||||
|
"apples", "lemons", "water"
|
||||||
|
}: # flags in-line set literals
|
||||||
|
print(f"I like {item}.")
|
||||||
|
|
||||||
numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
||||||
|
|
||||||
numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
use ast::ExprContext;
|
|
||||||
use ruff_python_ast::{self as ast, Expr};
|
|
||||||
|
|
||||||
use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Edit, Fix};
|
use ruff_diagnostics::{AlwaysFixableViolation, Diagnostic, Edit, Fix};
|
||||||
use ruff_macros::{derive_message_formats, violation};
|
use ruff_macros::{derive_message_formats, violation};
|
||||||
use ruff_text_size::{Ranged, TextRange};
|
use ruff_python_ast::{self as ast, Expr};
|
||||||
|
use ruff_text_size::Ranged;
|
||||||
|
|
||||||
use crate::checkers::ast::Checker;
|
use crate::checkers::ast::Checker;
|
||||||
|
|
||||||
|
@ -38,7 +36,7 @@ impl AlwaysFixableViolation for IterationOverSet {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn fix_title(&self) -> String {
|
fn fix_title(&self) -> String {
|
||||||
format!("Use a sequence type instead of a `set` when iterating over values")
|
format!("Convert to `tuple`")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -54,15 +52,14 @@ pub(crate) fn iteration_over_set(checker: &mut Checker, expr: &Expr) {
|
||||||
|
|
||||||
let mut diagnostic = Diagnostic::new(IterationOverSet, expr.range());
|
let mut diagnostic = Diagnostic::new(IterationOverSet, expr.range());
|
||||||
|
|
||||||
let tuple = checker.generator().expr(&Expr::Tuple(ast::ExprTuple {
|
let tuple = if let [elt] = elts.as_slice() {
|
||||||
elts: elts.clone(),
|
let elt = checker.locator().slice(elt);
|
||||||
ctx: ExprContext::Store,
|
format!("({elt},)")
|
||||||
range: TextRange::default(),
|
} else {
|
||||||
}));
|
let set = checker.locator().slice(expr);
|
||||||
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(
|
format!("({})", &set[1..set.len() - 1])
|
||||||
format!("({tuple})"),
|
};
|
||||||
expr.range(),
|
diagnostic.set_fix(Fix::safe_edit(Edit::range_replacement(tuple, expr.range())));
|
||||||
)));
|
|
||||||
|
|
||||||
checker.diagnostics.push(diagnostic);
|
checker.diagnostics.push(diagnostic);
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ iteration_over_set.py:3:13: PLC0208 [*] Use a sequence type instead of a `set` w
|
||||||
| ^^^ PLC0208
|
| ^^^ PLC0208
|
||||||
4 | print(f"I can count to {item}!")
|
4 | print(f"I can count to {item}!")
|
||||||
|
|
|
|
||||||
= help: Use a sequence type instead of a `set` when iterating over values
|
= help: Convert to `tuple`
|
||||||
|
|
||||||
ℹ Fix
|
ℹ Fix
|
||||||
1 1 | # Errors
|
1 1 | # Errors
|
||||||
|
@ -28,7 +28,7 @@ iteration_over_set.py:6:13: PLC0208 [*] Use a sequence type instead of a `set` w
|
||||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0208
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ PLC0208
|
||||||
7 | print(f"I like {item}.")
|
7 | print(f"I like {item}.")
|
||||||
|
|
|
|
||||||
= help: Use a sequence type instead of a `set` when iterating over values
|
= help: Convert to `tuple`
|
||||||
|
|
||||||
ℹ Fix
|
ℹ Fix
|
||||||
3 3 | for item in {1}:
|
3 3 | for item in {1}:
|
||||||
|
@ -38,90 +38,136 @@ iteration_over_set.py:6:13: PLC0208 [*] Use a sequence type instead of a `set` w
|
||||||
6 |+for item in ("apples", "lemons", "water"): # flags in-line set literals
|
6 |+for item in ("apples", "lemons", "water"): # flags in-line set literals
|
||||||
7 7 | print(f"I like {item}.")
|
7 7 | print(f"I like {item}.")
|
||||||
8 8 |
|
8 8 |
|
||||||
9 9 | numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
9 9 | for item in {1,}:
|
||||||
|
|
||||||
iteration_over_set.py:9:28: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
iteration_over_set.py:9:13: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
||||||
|
|
|
|
||||||
7 | print(f"I like {item}.")
|
7 | print(f"I like {item}.")
|
||||||
8 |
|
8 |
|
||||||
9 | numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
9 | for item in {1,}:
|
||||||
| ^^^^^^^^^ PLC0208
|
| ^^^^ PLC0208
|
||||||
10 |
|
10 | print(f"I can count to {item}!")
|
||||||
11 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
|
||||||
|
|
|
|
||||||
= help: Use a sequence type instead of a `set` when iterating over values
|
= help: Convert to `tuple`
|
||||||
|
|
||||||
ℹ Fix
|
ℹ Fix
|
||||||
6 6 | for item in {"apples", "lemons", "water"}: # flags in-line set literals
|
6 6 | for item in {"apples", "lemons", "water"}: # flags in-line set literals
|
||||||
7 7 | print(f"I like {item}.")
|
7 7 | print(f"I like {item}.")
|
||||||
8 8 |
|
8 8 |
|
||||||
9 |-numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
9 |-for item in {1,}:
|
||||||
9 |+numbers_list = [i for i in (1, 2, 3)] # flags sets in list comprehensions
|
9 |+for item in (1,):
|
||||||
10 10 |
|
10 10 | print(f"I can count to {item}!")
|
||||||
11 11 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
11 11 |
|
||||||
12 12 |
|
12 12 | for item in {
|
||||||
|
|
||||||
iteration_over_set.py:11:27: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
iteration_over_set.py:12:13: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
||||||
|
|
|
|
||||||
9 | numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
10 | print(f"I can count to {item}!")
|
||||||
10 |
|
11 |
|
||||||
11 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
12 | for item in {
|
||||||
| ^^^^^^^^^ PLC0208
|
| _____________^
|
||||||
12 |
|
13 | | "apples", "lemons", "water"
|
||||||
13 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
14 | | }: # flags in-line set literals
|
||||||
|
| |_^ PLC0208
|
||||||
|
15 | print(f"I like {item}.")
|
||||||
|
|
|
|
||||||
= help: Use a sequence type instead of a `set` when iterating over values
|
= help: Convert to `tuple`
|
||||||
|
|
||||||
ℹ Fix
|
ℹ Fix
|
||||||
8 8 |
|
9 9 | for item in {1,}:
|
||||||
9 9 | numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
10 10 | print(f"I can count to {item}!")
|
||||||
10 10 |
|
11 11 |
|
||||||
11 |-numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
12 |-for item in {
|
||||||
11 |+numbers_set = {i for i in (1, 2, 3)} # flags sets in set comprehensions
|
12 |+for item in (
|
||||||
12 12 |
|
13 13 | "apples", "lemons", "water"
|
||||||
13 13 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
14 |-}: # flags in-line set literals
|
||||||
14 14 |
|
14 |+): # flags in-line set literals
|
||||||
|
15 15 | print(f"I like {item}.")
|
||||||
iteration_over_set.py:13:36: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
|
||||||
|
|
|
||||||
11 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
|
||||||
12 |
|
|
||||||
13 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
|
||||||
| ^^^^^^^^^ PLC0208
|
|
||||||
14 |
|
|
||||||
15 | numbers_gen = (i for i in {1, 2, 3}) # flags sets in generator expressions
|
|
||||||
|
|
|
||||||
= help: Use a sequence type instead of a `set` when iterating over values
|
|
||||||
|
|
||||||
ℹ Fix
|
|
||||||
10 10 |
|
|
||||||
11 11 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
|
||||||
12 12 |
|
|
||||||
13 |-numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
|
||||||
13 |+numbers_dict = {str(i): i for i in (1, 2, 3)} # flags sets in dict comprehensions
|
|
||||||
14 14 |
|
|
||||||
15 15 | numbers_gen = (i for i in {1, 2, 3}) # flags sets in generator expressions
|
|
||||||
16 16 |
|
16 16 |
|
||||||
|
17 17 | numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
||||||
|
|
||||||
iteration_over_set.py:15:27: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
iteration_over_set.py:17:28: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
||||||
|
|
|
|
||||||
13 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
15 | print(f"I like {item}.")
|
||||||
14 |
|
|
||||||
15 | numbers_gen = (i for i in {1, 2, 3}) # flags sets in generator expressions
|
|
||||||
| ^^^^^^^^^ PLC0208
|
|
||||||
16 |
|
16 |
|
||||||
17 | # Non-errors
|
17 | numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
||||||
|
| ^^^^^^^^^ PLC0208
|
||||||
|
18 |
|
||||||
|
19 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
||||||
|
|
|
|
||||||
= help: Use a sequence type instead of a `set` when iterating over values
|
= help: Convert to `tuple`
|
||||||
|
|
||||||
ℹ Fix
|
ℹ Fix
|
||||||
12 12 |
|
14 14 | }: # flags in-line set literals
|
||||||
13 13 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
15 15 | print(f"I like {item}.")
|
||||||
14 14 |
|
|
||||||
15 |-numbers_gen = (i for i in {1, 2, 3}) # flags sets in generator expressions
|
|
||||||
15 |+numbers_gen = (i for i in (1, 2, 3)) # flags sets in generator expressions
|
|
||||||
16 16 |
|
16 16 |
|
||||||
17 17 | # Non-errors
|
17 |-numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
||||||
|
17 |+numbers_list = [i for i in (1, 2, 3)] # flags sets in list comprehensions
|
||||||
18 18 |
|
18 18 |
|
||||||
|
19 19 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
||||||
|
20 20 |
|
||||||
|
|
||||||
|
iteration_over_set.py:19:27: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
||||||
|
|
|
||||||
|
17 | numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
||||||
|
18 |
|
||||||
|
19 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
||||||
|
| ^^^^^^^^^ PLC0208
|
||||||
|
20 |
|
||||||
|
21 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
||||||
|
|
|
||||||
|
= help: Convert to `tuple`
|
||||||
|
|
||||||
|
ℹ Fix
|
||||||
|
16 16 |
|
||||||
|
17 17 | numbers_list = [i for i in {1, 2, 3}] # flags sets in list comprehensions
|
||||||
|
18 18 |
|
||||||
|
19 |-numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
||||||
|
19 |+numbers_set = {i for i in (1, 2, 3)} # flags sets in set comprehensions
|
||||||
|
20 20 |
|
||||||
|
21 21 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
||||||
|
22 22 |
|
||||||
|
|
||||||
|
iteration_over_set.py:21:36: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
||||||
|
|
|
||||||
|
19 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
||||||
|
20 |
|
||||||
|
21 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
||||||
|
| ^^^^^^^^^ PLC0208
|
||||||
|
22 |
|
||||||
|
23 | numbers_gen = (i for i in {1, 2, 3}) # flags sets in generator expressions
|
||||||
|
|
|
||||||
|
= help: Convert to `tuple`
|
||||||
|
|
||||||
|
ℹ Fix
|
||||||
|
18 18 |
|
||||||
|
19 19 | numbers_set = {i for i in {1, 2, 3}} # flags sets in set comprehensions
|
||||||
|
20 20 |
|
||||||
|
21 |-numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
||||||
|
21 |+numbers_dict = {str(i): i for i in (1, 2, 3)} # flags sets in dict comprehensions
|
||||||
|
22 22 |
|
||||||
|
23 23 | numbers_gen = (i for i in {1, 2, 3}) # flags sets in generator expressions
|
||||||
|
24 24 |
|
||||||
|
|
||||||
|
iteration_over_set.py:23:27: PLC0208 [*] Use a sequence type instead of a `set` when iterating over values
|
||||||
|
|
|
||||||
|
21 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
||||||
|
22 |
|
||||||
|
23 | numbers_gen = (i for i in {1, 2, 3}) # flags sets in generator expressions
|
||||||
|
| ^^^^^^^^^ PLC0208
|
||||||
|
24 |
|
||||||
|
25 | # Non-errors
|
||||||
|
|
|
||||||
|
= help: Convert to `tuple`
|
||||||
|
|
||||||
|
ℹ Fix
|
||||||
|
20 20 |
|
||||||
|
21 21 | numbers_dict = {str(i): i for i in {1, 2, 3}} # flags sets in dict comprehensions
|
||||||
|
22 22 |
|
||||||
|
23 |-numbers_gen = (i for i in {1, 2, 3}) # flags sets in generator expressions
|
||||||
|
23 |+numbers_gen = (i for i in (1, 2, 3)) # flags sets in generator expressions
|
||||||
|
24 24 |
|
||||||
|
25 25 | # Non-errors
|
||||||
|
26 26 |
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue