Skip to content

Generic with ParamSpec and Concatenate substitutions behave incorrectly #492

Closed
@Daraan

Description

@Daraan

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

  • 3.8 & 3.9 substitution of Concatenate
  • 3.10 does not correctly collect type parameters
  • < 3.11.3 wrong substitution behavior; type parameter not removed
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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions