diff --git a/crates/ruff/resources/test/fixtures/pyflakes/F523.py b/crates/ruff/resources/test/fixtures/pyflakes/F523.py index 75935e4a5f..2055dd3a31 100644 --- a/crates/ruff/resources/test/fixtures/pyflakes/F523.py +++ b/crates/ruff/resources/test/fixtures/pyflakes/F523.py @@ -11,3 +11,9 @@ "{}".format(1, 2, 3) # F523 "{:{}}".format(1, 2) # No issues "{:{}}".format(1, 2, 3) # F523 + +# With *args +"{0}{1}".format(*args) # No issues +"{0}{1}".format(1, *args) # No issues +"{0}{1}".format(1, 2, *args) # No issues +"{0}{1}".format(1, 2, 3, *args) # F523 diff --git a/crates/ruff/src/rules/pyflakes/rules/strings.rs b/crates/ruff/src/rules/pyflakes/rules/strings.rs index 8b899fd5e1..9e72866fbb 100644 --- a/crates/ruff/src/rules/pyflakes/rules/strings.rs +++ b/crates/ruff/src/rules/pyflakes/rules/strings.rs @@ -493,12 +493,15 @@ pub(crate) fn string_dot_format_extra_positional_arguments( args: &[Expr], location: Range, ) { - if has_star_args(args) { - return; - } - - let missing: Vec = (0..args.len()) - .filter(|i| !(summary.autos.contains(i) || summary.indices.contains(i))) + let missing: Vec = args + .iter() + .enumerate() + .filter(|(i, arg)| { + !(matches!(arg.node, ExprKind::Starred { .. }) + || summary.autos.contains(i) + || summary.indices.contains(i)) + }) + .map(|(i, _)| i) .collect(); if missing.is_empty() { diff --git a/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__F523_F523.py.snap b/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__F523_F523.py.snap index b2d110a1a6..69e67abd39 100644 --- a/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__F523_F523.py.snap +++ b/crates/ruff/src/rules/pyflakes/snapshots/ruff__rules__pyflakes__tests__F523_F523.py.snap @@ -170,4 +170,25 @@ expression: diagnostics row: 13 column: 23 parent: ~ +- kind: + name: StringDotFormatExtraPositionalArguments + body: "`.format` call has unused arguments at position(s): 2" + suggestion: "Remove extra positional arguments at position(s): 2" + fixable: true + location: + row: 19 + column: 0 + end_location: + row: 19 + column: 31 + fix: + edits: + - content: "\"{0}{1}\".format(1, 2, *args)" + location: + row: 19 + column: 0 + end_location: + row: 19 + column: 31 + parent: ~