python / typing_extensions

Backported and experimental type hints for Python
Other
445 stars 109 forks source link

Generic with ParamSpec and Concatenate substitutions behave incorrectly #492

Open Daraan opened 1 month ago

Daraan commented 1 month ago

The following code displays some incorrect behavior, but different parts do not work in certain ranges of 3.8-3.11.3

from typing import Generic, TypeVar
from typing_extensions import ParamSpec, Concatenate
P = ParamSpec('P')
T = TypeVar("T")

class CLS(Generic[P]): ...

Y = CLS[T] # or with a ParamSpec
# 3.10
Y[str]  # raises TypeError is not a generic class

# 3.8 & 3.9
G9 = CLS[Concatenate[T, P]]
H9 = G9[int, [T]] # should be ok; but TypeError
H9[str]  # should also work

# 3.11.0
G8 = CLS[Concatenate[T, ...]]
H1 = G8[int]
H1[str]  # for python 3.11.0-3 this still has a parameter and does not raise a TypeError

This is a variant of #126 but with generics which require different fixes. There are multiple flavors of this issue depending on the version parameters are not recognized or not substituted correctly.

For a more comprehensive list check the skipped tests of #491 here


It's possible that some substitutions with Concatenate worked prior to #479 and caused a regression here, but I am not yet certain.


Fixes come with