Fix crash when passing too many type arguments to generic base class accepting single ParamSpec #17770
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 #17765
The offender for this crash appears to be this snippet:
mypy/mypy/semanal.py
Lines 5905 to 5910 in 72c413d
This branch triggers when applying type args to a type that is generic with respect to a single
ParamSpec
. It allows double brackets to be omitted when providing a parameter specification by wrapping all of the provided type arguments into a single parameter specification argument (i.e. equatingFoo[int, int]
toFoo[[int, int]]
). This wrapping occurs unless:Any
(e.g.Foo[Any]
)ParamSpec
(e.g.Foo[[int, int]]
)The problem occurs when multiple type arguments provided and at least one of them is a bracketed parameter specification, as in
Foo[[int, int], str]
.Per the rules above, since there is more than 1 type argument, mypy attempts to wrap the arguments into a single parameter specification. This results in the attempted creation of a
Parameters
instance that contains anotherParameters
instance, which triggers this assert insideParameters.__init__
:mypy/mypy/types.py
Line 1634 in 72c413d
I think a reasonable solution is to forgo wrapping the type arguments into a single
Parameters
if any of the provided type arguments are aParameters
/ParamSpecType
. That is, don't transformFoo[A1, A2, ...]
toFoo[[A1, A2, ...]]
if any ofA1, A2, ...
are a parameter specification.This change brings the crash case inline with mypy's current behavior for a similar case:
Before this change:
After this change: