Skip to content

[pydocstyle] Treat backslash-escaped *args and **kwargs as documented (D417) - #29536

Merged
ntBre merged 1 commit into
astral-sh:mainfrom
fixfon:fix/29535-d417-escaped-star-args
Oct 20, 2026
Merged

ntBre merged 1 commit into
astral-sh:mainfrom
fixfon:fix/29535-d417-escaped-star-args

Conversation

@fixfon

@fixfon fixfon commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

Summary

Closes #29535.

Sphinx-style docstrings often escape the stars as \*args and \*\*kwargs, because a bare * starts emphasis in reST. D417 didn't account for that, so it reported those parameters as undocumented even though they were documented.

It went wrong in a different way for each style. In NumPy-style sections, the name before the : was taken verbatim, so \*\*kwargs never matched **kwargs. In Google-style sections, the regex didn't accept a leading \, so the whole line was skipped.

I added a small unescape_parameter_name helper in sections.rs that strips backslashes from the documented name, and both parsers now use it. The Google regex also accepts up to two escaped stars now. Since a backslash can't be part of a Python parameter name, removing all of them should be safe. This also covers non-raw docstrings that write \\*\\*kwargs.

Test Plan

I added five cases to D417.py: escaped NumPy and Google docstrings with every parameter documented, the same two styles with one parameter actually missing, and a non-raw docstring. Without the fix, all five d417 tests fail and report *args and **kwargs as missing. With the fix, the fully documented functions aren't flagged. In the missing variants, only the parameters that really are missing get reported. The snapshots are updated, and cargo test -p ruff_linter -- pydocstyle and clippy both pass.

I used Claude (via T3 Code) to help with the implementation. I've reviewed the change and can explain it.

… `D417` (astral-sh#29535)

reStructuredText requires `*` to be escaped as `\*`, so Sphinx-oriented docstrings document variadic parameters as `\*args` and `\*\*kwargs`. Strip the escaping backslashes from the documented names (NumPy and Google styles) before comparing them against the signature, and let the Google argument regex match a leading backslash.
@astral-sh-bot
astral-sh-bot Bot requested a review from ntBre October 20, 2026 11:24
@astral-sh-bot

astral-sh-bot Bot commented Oct 20, 2026

Copy link
Copy Markdown

ruff-ecosystem results

Linter (stable)

✅ ecosystem check detected no linter changes.

Linter (preview)

✅ ecosystem check detected no linter changes.

@0xamlab

This comment was marked as spam.

@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.

Thank you!

Replacing all backslashes means we'll be a little overly permissive. For example, we'd convert something invalid like foo\\bar to foobar, rather than only replacing \*, but I think that's okay.

@ntBre ntBre added bug An issue describing something that isn't working, or a PR that fixes a bug docstring Related to docstring linting, formatting, or rendering in Ruff or ty labels Oct 20, 2026
@ntBre
ntBre merged commit 8ebb34e into astral-sh:main Oct 20, 2026
52 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 docstring Related to docstring linting, formatting, or rendering in Ruff or ty

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve D417 missdetection for *args and **kwargs when backslash.

3 participants