self.assertEqual(repr(foo.__annotations__['kwargs']),
f"typing.Unpack[{__name__}.Movie]")
+ def test_builtin_tuple(self):
+ Ts = TypeVarTuple("Ts")
+
+ class Old(Generic[*Ts]): ...
+ class New[*Ts]: ...
+
+ PartOld = Old[int, *Ts]
+ self.assertEqual(PartOld[str].__args__, (int, str))
+ self.assertEqual(PartOld[*tuple[str]].__args__, (int, str))
+ self.assertEqual(PartOld[*Tuple[str]].__args__, (int, str))
+ self.assertEqual(PartOld[Unpack[tuple[str]]].__args__, (int, str))
+ self.assertEqual(PartOld[Unpack[Tuple[str]]].__args__, (int, str))
+
+ PartNew = New[int, *Ts]
+ self.assertEqual(PartNew[str].__args__, (int, str))
+ self.assertEqual(PartNew[*tuple[str]].__args__, (int, str))
+ self.assertEqual(PartNew[*Tuple[str]].__args__, (int, str))
+ self.assertEqual(PartNew[Unpack[tuple[str]]].__args__, (int, str))
+ self.assertEqual(PartNew[Unpack[Tuple[str]]].__args__, (int, str))
+
+ def test_unpack_wrong_type(self):
+ Ts = TypeVarTuple("Ts")
+ class Gen[*Ts]: ...
+ PartGen = Gen[int, *Ts]
+
+ bad_unpack_param = re.escape("Unpack[...] must be used with a tuple type")
+ with self.assertRaisesRegex(TypeError, bad_unpack_param):
+ PartGen[Unpack[list[int]]]
+ with self.assertRaisesRegex(TypeError, bad_unpack_param):
+ PartGen[Unpack[List[int]]]
+
+
class TypeVarTupleTests(BaseTestCase):
def assertEndsWith(self, string, tail):
assert self.__origin__ is Unpack
assert len(self.__args__) == 1
arg, = self.__args__
- if isinstance(arg, _GenericAlias):
- assert arg.__origin__ is tuple
+ if isinstance(arg, (_GenericAlias, types.GenericAlias)):
+ if arg.__origin__ is not tuple:
+ raise TypeError("Unpack[...] must be used with a tuple type")
return arg.__args__
return None