From e857ad6ba97dcd757b251659e5b15e2acc5a6262 Mon Sep 17 00:00:00 2001 From: Shantanu Date: Sun, 3 May 2020 21:02:26 -0700 Subject: [PATCH] zip: add some overloads for heterogeneous tuples (#3830) Technically this is a lie, since we return a heterogeneous iterator, not a tuple. But since we don't have a way of typing heterogeneous iterators, this is the best we can do. Fixes https://github.com/python/mypy/issues/8454 --- stdlib/2/__builtin__.pyi | 10 ++++++++++ stdlib/2and3/builtins.pyi | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/stdlib/2/__builtin__.pyi b/stdlib/2/__builtin__.pyi index 746190072..a4ed1f738 100644 --- a/stdlib/2/__builtin__.pyi +++ b/stdlib/2/__builtin__.pyi @@ -1444,6 +1444,16 @@ if sys.version_info < (3,): def unichr(__i: int) -> unicode: ... def vars(__object: Any = ...) -> Dict[str, Any]: ... if sys.version_info >= (3,): + # Some overloads to better support zipping heterogeneous tuples + @overload + def zip(*iterables: Tuple[_T1, _T2]) -> Tuple[Tuple[_T1, ...], Tuple[_T2, ...]]: ... # type: ignore + @overload + def zip(*iterables: Tuple[_T1, _T2, _T3]) -> Tuple[Tuple[_T1, ...], Tuple[_T2, ...], Tuple[_T3, ...]]: ... # type: ignore + @overload + def zip(*iterables: Tuple[_T1, _T2, _T3, _T4]) -> Tuple[Tuple[_T1, ...], Tuple[_T2, ...], Tuple[_T3, ...], Tuple[_T4, ...]]: ... # type: ignore + @overload + def zip(*iterables: Tuple[_T1, _T2, _T3, _T4, _T5]) -> Tuple[Tuple[_T1, ...], Tuple[_T2, ...], Tuple[_T3, ...], Tuple[_T4, ...], Tuple[_T5, ...]]: ... # type: ignore + @overload def zip(__iter1: Iterable[_T1]) -> Iterator[Tuple[_T1]]: ... @overload diff --git a/stdlib/2and3/builtins.pyi b/stdlib/2and3/builtins.pyi index 746190072..a4ed1f738 100644 --- a/stdlib/2and3/builtins.pyi +++ b/stdlib/2and3/builtins.pyi @@ -1444,6 +1444,16 @@ if sys.version_info < (3,): def unichr(__i: int) -> unicode: ... def vars(__object: Any = ...) -> Dict[str, Any]: ... if sys.version_info >= (3,): + # Some overloads to better support zipping heterogeneous tuples + @overload + def zip(*iterables: Tuple[_T1, _T2]) -> Tuple[Tuple[_T1, ...], Tuple[_T2, ...]]: ... # type: ignore + @overload + def zip(*iterables: Tuple[_T1, _T2, _T3]) -> Tuple[Tuple[_T1, ...], Tuple[_T2, ...], Tuple[_T3, ...]]: ... # type: ignore + @overload + def zip(*iterables: Tuple[_T1, _T2, _T3, _T4]) -> Tuple[Tuple[_T1, ...], Tuple[_T2, ...], Tuple[_T3, ...], Tuple[_T4, ...]]: ... # type: ignore + @overload + def zip(*iterables: Tuple[_T1, _T2, _T3, _T4, _T5]) -> Tuple[Tuple[_T1, ...], Tuple[_T2, ...], Tuple[_T3, ...], Tuple[_T4, ...], Tuple[_T5, ...]]: ... # type: ignore + @overload def zip(__iter1: Iterable[_T1]) -> Iterator[Tuple[_T1]]: ... @overload