From: Serhiy Storchaka Date: Wed, 13 Apr 2022 03:08:49 +0000 (+0300) Subject: bpo-43224: Forbid TypeVar substitution with Unpack (GH-32031) X-Git-Tag: v3.11.0b1~388 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=15537c51c188a6633248c25d211d5216e673aee3;p=thirdparty%2FPython%2Fcpython.git bpo-43224: Forbid TypeVar substitution with Unpack (GH-32031) --- diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index 2afa5449bc2e..97fc66a2f748 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 46fc72218dce..1b584bea0c3e 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