Skip to content

[pylint] Mark fixes unsafe when deleting comments (PLR5501, PLW0120) - #29414

Merged
ntBre merged 2 commits into
astral-sh:mainfrom
fixfon:t3/keep-else-line-comment-pylint
Oct 16, 2026
Merged

ntBre merged 2 commits into
astral-sh:mainfrom
fixfon:t3/keep-else-line-comment-pylint

Conversation

@fixfon

@fixfon fixfon commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #29395.

Both fixes rewrote the else: line and silently dropped any comment after the colon. Following review, the fix no longer tries to move that comment. Instead, PLR5501 and PLW0120 now mark the fix as unsafe when the else: line has a comment that would be deleted, the same approach as UP035 (#29413). Without such a comment the fix stays safe. Inline bodies like else: x = 1 # c also stay safe, since only else: is removed and the comment belongs to the statement.

Both rules got a "Fix safety" section in their docs. The existing PLW0120 snapshots only gain the unsafe-fix note, because their fixtures use else: # [useless-else-on-loop]. New fixture cases cover the unsafe and safe paths for both rules.

I used an AI assistant while working on this and reviewed the changes myself.

@astral-sh-bot
astral-sh-bot Bot requested a review from ntBre October 15, 2026 07:00
@astral-sh-bot

astral-sh-bot Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

ruff-ecosystem results

Linter (stable)

ℹ️ ecosystem check detected linter changes. (+0 -0 violations, +0 -2 fixes in 1 projects; 57 projects unchanged)

prefecthq/prefect (+0 -0 violations, +0 -2 fixes)

- src/prefect/utilities/pydantic.py:274:5: PLW0120 [*] `else` clause on loop without a `break` statement; remove the `else` and dedent its contents
+ src/prefect/utilities/pydantic.py:274:5: PLW0120 `else` clause on loop without a `break` statement; remove the `else` and dedent its contents

Changes by rule (1 rules affected)

code total + violation - violation + fix - fix
PLW0120 2 0 0 0 2

Linter (preview)

ℹ️ ecosystem check detected linter changes. (+1 -1 violations, +0 -0 fixes in 1 projects; 57 projects unchanged)

prefecthq/prefect (+1 -1 violations, +0 -0 fixes)

ruff check --no-cache --exit-zero --no-fix --output-format concise --preview

- src/prefect/utilities/pydantic.py:274:5: useless-else-on-loop [*] `else` clause on loop without a `break` statement; remove the `else` and dedent its contents
+ src/prefect/utilities/pydantic.py:274:5: useless-else-on-loop `else` clause on loop without a `break` statement; remove the `else` and dedent its contents

Changes by rule (1 rules affected)

code total + violation - violation + fix - fix
useless-else-on-loop 2 1 1 0 0

@fixfon
fixfon force-pushed the t3/keep-else-line-comment-pylint branch from f754448 to 98d4494 Compare October 15, 2026 17:45
@ntBre

ntBre commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Thanks for looking into this! The changes aren't that involved, but I'm kind of leaning toward just marking the fixes unsafe if they would drop comments, instead of trying to retain them. The bit about breaking noqa comments by moving them seems especially unfortunate, even if that already happens in the RET rules. These also seem like fairly niche places to have comments, so just marking them unsafe seems fine.

…LR5501`, `PLW0120`)

Both fixes replace the `else:` line, so a trailing comment on it (e.g.,
`else:  # fallback`) was deleted while the fix was still marked safe.

Rather than moving the comment, mark the fix unsafe when the `else` line
has a comment, using the same `comment_ranges().intersects` check as
other rules, and document it in a "Fix safety" section. Fixes without a
comment on the `else` line, including an inline `else:` body whose
trailing comment belongs to the statement, stay safe.
@fixfon
fixfon force-pushed the t3/keep-else-line-comment-pylint branch from 98d4494 to aca8801 Compare October 16, 2026 21:47
@fixfon fixfon changed the title [pylint] Keep else: line comments in PLR5501 and PLW0120 fixes [pylint] Mark PLR5501 and PLW0120 fixes unsafe when they delete an else: line comment Oct 16, 2026
@fixfon

fixfon commented Oct 16, 2026

Copy link
Copy Markdown
Contributor Author

Thanks, that makes sense. I removed the comment-moving logic. Both PLR5501 and PLW0120 now mark the fix as unsafe when it would delete a comment on the else: line, and stay safe otherwise. The PLW0120 snapshots are back to their original output, apart from the added unsafe-fix note, since those fixtures have a comment on the else: line. I also added fixture cases for the unsafe and safe paths.

@ntBre ntBre left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Thanks!

@ntBre ntBre added bug An issue describing something that isn't working, or a PR that fixes a bug fixes Related to suggested fixes for violations labels Oct 16, 2026
@ntBre ntBre changed the title [pylint] Mark PLR5501 and PLW0120 fixes unsafe when they delete an else: line comment [pylint] Mark fixes unsafe when deleting comments (PLR5501, PLW0120) Oct 16, 2026
@ntBre
ntBre merged commit 8d122c1 into astral-sh:main Oct 16, 2026
51 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug An issue describing something that isn't working, or a PR that fixes a bug fixes Related to suggested fixes for violations

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PLR5501 and PLW0120 safe fixes delete a trailing comment on the else: line

2 participants