diff --git a/crates/ruff/resources/test/fixtures/pylint/iteration_over_set.py b/crates/ruff/resources/test/fixtures/pylint/iteration_over_set.py index 1b22612e52..901dd3f196 100644 --- a/crates/ruff/resources/test/fixtures/pylint/iteration_over_set.py +++ b/crates/ruff/resources/test/fixtures/pylint/iteration_over_set.py @@ -36,3 +36,6 @@ for item in set(("apples", "lemons", "water")): # set constructor is fine for number in {i for i in range(10)}: # set comprehensions are fine print(number) + +for item in {*numbers_set, 4, 5, 6}: # set unpacking is fine + print(f"I like {item}.") diff --git a/crates/ruff/src/rules/pylint/rules/iteration_over_set.rs b/crates/ruff/src/rules/pylint/rules/iteration_over_set.rs index b98806c7c8..38725f7e4f 100644 --- a/crates/ruff/src/rules/pylint/rules/iteration_over_set.rs +++ b/crates/ruff/src/rules/pylint/rules/iteration_over_set.rs @@ -1,4 +1,4 @@ -use rustpython_parser::ast::{Expr, Ranged}; +use rustpython_parser::ast::{self, Expr, Ranged}; use ruff_diagnostics::{Diagnostic, Violation}; use ruff_macros::{derive_message_formats, violation}; @@ -38,9 +38,15 @@ impl Violation for IterationOverSet { /// PLC0208 pub(crate) fn iteration_over_set(checker: &mut Checker, expr: &Expr) { - if expr.is_set_expr() { - checker - .diagnostics - .push(Diagnostic::new(IterationOverSet, expr.range())); + let Expr::Set(ast::ExprSet { elts, .. }) = expr else { + return; + }; + + if elts.iter().any(Expr::is_starred_expr) { + return; } + + checker + .diagnostics + .push(Diagnostic::new(IterationOverSet, expr.range())); }