From 15537c51c188a6633248c25d211d5216e673aee3 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Wed, 13 Apr 2022 06:08:49 +0300 Subject: bpo-43224: Forbid TypeVar substitution with Unpack (GH-32031) --- Lib/test/test_typing.py | 14 ++++++++++++++ Lib/typing.py | 2 ++ 2 files changed, 16 insertions(+) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 2afa544..97fc66a 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -562,6 +562,20 @@ class TypeVarTupleTests(BaseTestCase): self.assertEqual(E[float, str, int, bytes], Tuple[List[float], A[str, int], List[bytes]]) + def test_bad_var_substitution(self): + Ts = TypeVarTuple('Ts') + T = TypeVar('T') + T2 = TypeVar('T2') + class G(Generic[Unpack[Ts]]): pass + + for A in G, Tuple: + B = A[T, Unpack[Ts], str, T2] + with self.assertRaises(TypeError): + B[int, Unpack[Ts]] + C = A[T, Unpack[Ts], str, T2] + with self.assertRaises(TypeError): + C[int, Unpack[Ts], Unpack[Ts]] + def test_repr_is_correct(self): Ts = TypeVarTuple('Ts') self.assertEqual(repr(Ts), 'Ts') diff --git a/Lib/typing.py b/Lib/typing.py index 46fc722..1b584be 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -965,6 +965,8 @@ class TypeVar(_Final, _Immutable, _BoundVarianceMixin, _root=True): def __typing_subst__(self, arg): msg = "Parameters to generic types must be types." arg = _type_check(arg, msg, is_argument=True) + if (isinstance(arg, _GenericAlias) and arg.__origin__ is Unpack): + raise TypeError(f"{arg} is not valid as type argument") return arg -- cgit v0.12