typing_extensions icon indicating copy to clipboard operation
typing_extensions copied to clipboard

`TypeAliasType` when a ParamSpec should be replaced raised type error

Open Daraan opened this issue 6 months ago • 0 comments

TypeAliasType currently has some bug/limitation when using it together with a ParamSpec in Python <3.10.

Root of the problem is the changed typing._type_check that was changed in Python 3.11 which makes typing_extensions.TypeAliasType.__getitem__ run into the TypeError in older Python versions:

arg: Ellipsis | list[type] # should be valid
-     if not callable(arg):
-        raise TypeError(f"{msg} Got {arg!r:.100}.")
+  if type(arg) is tuple:
+        raise TypeError(f"{msg} Got {arg!r:.100}.")

The following cases work in Python 3.11+ and fail in <= Python3.10

from typing_extensions import TypeAliasType, Callable, ParamSpec, Any

Foo = TypeAliasType("Foo", Callable[_PD, Any], type_params=(_PD,))

# Ok
FooInt = Foo[int] # (int) -> Any

# Error
FooInt2 = Foo[[int]] # (int) -> Any

# Error
FooIntInt = Foo[[int, int]] # (int, int) -> Any

# Error
FooWhatever = Foo[...] # (...) -> Any

# Error; should be invalid context
FooWhatever2 = Foo[[...]] # (...) -> Any

# Error
FooIntWhatever = Foo[[int, ...]] # (int, ...) -> Any

# ok, but invalid?; at least pylance reports wrong signature  (Concatenate[int, ...]) -> Any
FooConcatIntWhatever = Foo[Concatenate[int, ...]]

Daraan avatar Aug 21 '24 21:08 Daraan