Skip to content

stubtest: don't crash when a classmethod's first parameter isn't named cls - #21941

Open
HuzaifaChaudary wants to merge 1 commit into
python:masterfrom
HuzaifaChaudary:fix/stubtest-classmethod-first-param-name
Open

stubtest: don't crash when a classmethod's first parameter isn't named cls#21941
HuzaifaChaudary wants to merge 1 commit into
python:masterfrom
HuzaifaChaudary:fix/stubtest-classmethod-first-param-name

Conversation

@HuzaifaChaudary

Copy link
Copy Markdown

fixes #16583

the first parameter of a classmethod can be called anything . networkx really does write
def construct(EdgeComponentAuxGraph, G) . stubtest checked that name against a list of four
and raised StubtestFailure when it did not match :

StubtestFailure: unexpected class parameter name 'EdgeComponentAuxGraph' in pkg.EdgeComponentAuxGraph.construct

that is not a normal stubtest error , it stops the whole run , so one oddly named parameter
takes out stub checking for a whole distribution . that is what happens on
python/typeshed#13587 .

the name is never used for anything . the line right under it drops the argument by position ,
so the check was not guarding the code below it . it looks at the argument kind now instead .

while testing i found a second way onto the same line . a stub written def f(*args) under
@classmethod also crashed . there is nothing bound to drop in that case , and
inspect.signature of the runtime classmethod keeps the star argument too , so both sides
already match and it returns unchanged . dropping it would have made a false mismatch .

two cases added to test_static_class_method , one for the odd name and one for *args .
both fail on master with the crash above .

teststubtest.py and teststubgen.py give 440 passed , 1 skipped , 2 xfailed . self check
on the two files is clean , and so are black and ruff .

small heads up , #21863 adds its own cases to test_static_class_method starting on the same
line , so whichever goes in second will need a rebase . it is only the test file , that one
changes verify_var and this one changes _resolve_funcitem_from_decorator , so they do not
touch the same code .

…alled cls

the first parameter of a classmethod can be named anything, and networkx really does
write def construct(EdgeComponentAuxGraph, G). stubtest checked the name against a
list of four and raised StubtestFailure when it did not match, which aborts the whole
run rather than reporting an error, so one odd name takes out stub checking for a
whole distribution.

the name is never used, the argument is dropped positionally on the next line, so the
check guarded nothing. it looks at the argument kind instead now.

a stub written def f(*args) reached the same line and crashed too. there is nothing
bound to drop in that case, and inspect.signature of the runtime classmethod keeps the
star argument as well, so both sides already line up and it returns unchanged.
Copilot AI lite review requested due to automatic review settings September 4, 2026 22:05

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

stubtest raises an exception when a classmethod's first parameter not named cls

2 participants