Skip to content

Extend F507 to flag %-format strings with zero placeholders#24215

Merged
MichaReiser merged 2 commits intoastral-sh:mainfrom
RenzoMXD:feat/extend-f507-zero-placeholder-percent-format
Mar 27, 2026
Merged

Extend F507 to flag %-format strings with zero placeholders#24215
MichaReiser merged 2 commits intoastral-sh:mainfrom
RenzoMXD:feat/extend-f507-zero-placeholder-percent-format

Conversation

@RenzoMXD
Copy link
Copy Markdown
Contributor

Summary

  • Extends the F507 rule to detect "hello" % x where the format string has no placeholders, since this is almost certainly a bug (only () would succeed at runtime)
  • Catches all RHS types (variables, calls, attribute accesses) in the zero-placeholder case, not just literals
    • 'hello' % banana — flagged
    • '' % banana — flagged
    • 'hello' % unknown_var — flagged (unknown variables now caught too)
    • 'hello' % get_value() — flagged (function calls now caught too)
    • 'hello' % obj.attr — flagged (attribute access now caught too)
    • 'hello' % ()not flagged (empty tuple is the only valid case)

Test plan

  • Added test cases for zero-placeholder format strings with literal, variable, unknown, and function call RHS
  • Verified 'hello' % () (empty tuple) is correctly not flagged
  • All existing pyflakes tests pass (462/462)

Closes #24164

@astral-sh-bot
Copy link
Copy Markdown

astral-sh-bot bot commented Mar 26, 2026

ruff-ecosystem results

Linter (stable)

✅ ecosystem check detected no linter changes.

Linter (preview)

✅ ecosystem check detected no linter changes.

Copy link
Copy Markdown
Member

@MichaReiser MichaReiser left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you (I'll merge this tomorrow, because I don't want to interfer with the inprogress release)

@MichaReiser MichaReiser merged commit 5ab3570 into astral-sh:main Mar 27, 2026
42 checks passed
@ntBre ntBre added the rule Implementing or modifying a lint rule label Mar 27, 2026
carljm added a commit that referenced this pull request Mar 31, 2026
* main: (40 commits)
  [ty] resolve union-likes in emitting union attribute errors (#24263)
  [ty] Improve support for `Callable` type context (#23888)
  [ty] Propagate type context through `await` expressions (#24256)
  [`pyflakes`] Flag annotated variable redeclarations as `F811` in preview mode (#24244)
  [ty] Preserve `Divergent` when materializing recursive aliases (#24245)
  Fix W391 fixes for consecutive empty notebook cells (#24236)
  [flake8-bugbear] Clarify RUF071 fix safety for non-path string comparisons (#24149)
  [ty] Ban type qualifiers in PEP-695 type aliases (#24242)
  [ty] Include keyword-prefixed symbols in completions for attributes (#24232)
  [ty] Add tests for TypedDict method overloads on unions (#24230)
  [ty] report unused bindings as unnecessary hint diagnostics (#23305)
  Remove unused `non_root` variable (#24238)
  Extend F507 to flag %-format strings with zero placeholders (#24215)
  [`flake8-simplify`] Suppress `SIM105` for `except*` before Python 3.12 (#23869)
  Ignore pre-initialization references in SIM113 (#24235)
  Parenthesize expression in RUF050 fix (#24234)
  Publish playgrounds using the `release-playground` environment (#24223)
  [ty] Fix instance-attribute lookup in methods of protocol classes (#24213)
  [ty] Used shared expression cache during generic call inference (#24219)
  [ty] make `Type::BoundMethod` include instances of same-named methods bound to a subclass (#24039)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

rule Implementing or modifying a lint rule

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Mismatching number of %-placeholders in string

4 participants