Skip to content

Commit b3e6b7a

Browse files
committed
Unpack invalid Concatenate correctly
1 parent 621085f commit b3e6b7a

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

src/test_typing_extensions.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7339,9 +7339,7 @@ def test_invalid_cases(self):
73397339

73407340
# Test with Concatenate
73417341
callable_concat = CallableP[Concatenate[Any, T2, P], Any]
7342-
reveal_type(callable_concat)
73437342
self.assertEqual(callable_concat.__parameters__, (T2, P))
7344-
self.assertEqual(get_args(callable_concat), (Concatenate[Any, T2, P], Any))
73457343

73467344
# TypeVarTuple
73477345
Ts = TypeVarTuple("Ts")
@@ -7359,6 +7357,15 @@ def test_invalid_cases(self):
73597357
invalud_tuple_C = Variadic[[int, T]]
73607358
self.assertEqual(invalud_tuple_C.__parameters__, ())
73617359
self.assertEqual(get_args(invalud_tuple_C), ([int, T],))
7360+
7361+
@skipUnless(TYPING_3_11_0, "Concatenate not unpacked anymore")
7362+
def test_further_invalid_cases(self):
7363+
P = ParamSpec('P')
7364+
T = TypeVar("T")
7365+
T2 = TypeVar("T2")
7366+
CallableP = TypeAliasType("CallableP", Callable[P, T], type_params=(P,))
7367+
callable_concat = CallableP[Concatenate[Any, T2, P], Any]
7368+
self.assertEqual(get_args(callable_concat), (Concatenate[Any, T2, P], Any))
73627369

73637370
def test_pickle(self):
73647371
global Alias

src/typing_extensions.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3543,15 +3543,10 @@ def __getitem__(self, parameters):
35433543
else:
35443544
def _check_parameter(self, item, typ=_marker):
35453545
# Allow [], [int], [int, str], [int, ...], [int, T]
3546-
if isinstance(item, _UnpackAlias):
3547-
args = (
3548-
item.__args__ # e.g. (int, str)
3549-
if sys.version_info[:2] >= (3, 9)
3550-
else item.__args__ # (typing.Tuple[int, float],)
3551-
)
3546+
if isinstance(item, (_UnpackAlias, _ConcatenateGenericAlias)):
35523547
# Unpack
35533548
yield from [checked
3554-
for arg in args
3549+
for arg in item.__args__
35553550
for checked in self._check_parameter(arg)]
35563551
elif item is ...:
35573552
yield ...
@@ -3578,7 +3573,12 @@ def __getitem__(self, parameters):
35783573
for item, typ in zip(parameters, type_params)
35793574
for checked in self._check_parameter(item, typ)
35803575
]
3581-
alias = typing._GenericAlias(self, tuple(parameters))
3576+
if sys.version_info[:2] == (3, 10):
3577+
alias = typing._GenericAlias(self, tuple(parameters),
3578+
_typevar_types=(TypeVar, ParamSpec)
3579+
)
3580+
else:
3581+
alias = typing._GenericAlias(self, tuple(parameters))
35823582
alias.__name__ = self.__name__
35833583
alias.__value__ = self.__value__
35843584
alias.__type_params__ = self.__type_params__

0 commit comments

Comments
 (0)