Fix stubgen emitting invalid syntax for keyword-only dunder parameters - #21864
Open
arose26 wants to merge 1 commit into
Open
Fix stubgen emitting invalid syntax for keyword-only dunder parameters#21864arose26 wants to merge 1 commit into
arose26 wants to merge 1 commit into
Conversation
A parameter whose name starts with two underscores is positional-only by convention, but not when it appears after the keyword-only separator, where counting it put the / marker after the * and produced unparsable output.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #19315
stubgen produces output that will not parse:
Cause
A parameter whose name starts with two underscores is positional-only by the historical convention, and mypy marks it
pos_onlyon that basis alone. stubgen counts every such argument to decide where the/belongs:The convention does not apply after the keyword-only separator —
__kwindef f1(*, __kw)is simply keyword-only — but the argument is still counted, so the marker is inserted past the*that was already emitted.Change
A keyword-only argument no longer advances the marker position. Genuine positional-only parameters are unaffected, including the double-underscore spelling:
def f3(__pos, *, kw)still generatesdef f3(__pos, /, *, kw).Tests
testHistoricalPosOnlyParamsWithKeywordOnlycovers a keyword-only dunder on its own, mixed with a PEP 570 positional-only parameter, alongside a historical positional-only parameter, and with two of them. It fails before this change withdef f1(*, /, __kw)and passes after.mypy/test/teststubgen.pyis otherwise unchanged: 367 passed, withtestAttrsClass_semanalfailing identically before and after this change on my machine. Self-check onmypy/stubgen.py,ruffandblackare clean.