From d2469c0e895beed53e29d89d4c4c257b85ab77df Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Mon, 11 Jun 2018 15:52:44 -0700 Subject: [PATCH] fix type for itertools.product (#2129) Fixes #1850. The fix was already applied to Python 2, but the typevar-based solution there leads to "cannot infer value of type variable" in mypy. I used the following script to check: ```python from itertools import product reveal_type(product([1])) reveal_type(product([1], ['x'], [False], [3.0], [(1,)], [('x',)], [{1}], [{1: 2}], repeat=5)) ``` --- stdlib/2/itertools.pyi | 5 +++-- stdlib/3/itertools.pyi | 24 ++++++++++-------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/stdlib/2/itertools.pyi b/stdlib/2/itertools.pyi index c305ddac3..5dbfc343a 100644 --- a/stdlib/2/itertools.pyi +++ b/stdlib/2/itertools.pyi @@ -153,9 +153,10 @@ def product(iter1: Iterable[Any], iter4: Iterable[Any], iter5: Iterable[Any], iter6: Iterable[Any], - iter7: Iterable[Any], *iterables: Iterable) -> Iterator[Tuple]: ... + iter7: Iterable[Any], + *iterables: Iterable[Any]) -> Iterator[Tuple[Any, ...]]: ... @overload -def product(*iter: Iterable[_T], repeat: int) -> Iterator[Tuple[_T, ...]]: ... +def product(*iterables: Iterable[Any], repeat: int) -> Iterator[Tuple[Any, ...]]: ... def permutations(iterable: Iterable[_T], r: int = ...) -> Iterator[Sequence[_T]]: ... diff --git a/stdlib/3/itertools.pyi b/stdlib/3/itertools.pyi index bc0117d65..8ca88cf92 100644 --- a/stdlib/3/itertools.pyi +++ b/stdlib/3/itertools.pyi @@ -60,38 +60,32 @@ _T5 = TypeVar('_T5') _T6 = TypeVar('_T6') @overload -def product(iter1: Iterable[_T1], *, - repeat: int = ...) -> Iterator[Tuple[_T1]]: ... +def product(iter1: Iterable[_T1]) -> Iterator[Tuple[_T1]]: ... @overload def product(iter1: Iterable[_T1], - iter2: Iterable[_T2], *, - repeat: int = ...) -> Iterator[Tuple[_T1, _T2]]: ... + iter2: Iterable[_T2]) -> Iterator[Tuple[_T1, _T2]]: ... @overload def product(iter1: Iterable[_T1], iter2: Iterable[_T2], - iter3: Iterable[_T3], *, - repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3]]: ... + iter3: Iterable[_T3]) -> Iterator[Tuple[_T1, _T2, _T3]]: ... @overload def product(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3], - iter4: Iterable[_T4], *, - repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4]]: ... + iter4: Iterable[_T4]) -> Iterator[Tuple[_T1, _T2, _T3, _T4]]: ... @overload def product(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3], iter4: Iterable[_T4], - iter5: Iterable[_T5], *, - repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5]]: ... + iter5: Iterable[_T5]) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5]]: ... @overload def product(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3], iter4: Iterable[_T4], iter5: Iterable[_T5], - iter6: Iterable[_T6], *, - repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ... + iter6: Iterable[_T6]) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ... @overload def product(iter1: Iterable[Any], iter2: Iterable[Any], @@ -99,8 +93,10 @@ def product(iter1: Iterable[Any], iter4: Iterable[Any], iter5: Iterable[Any], iter6: Iterable[Any], - iter7: Iterable[Any], *iterables: Iterable, - repeat: int = ...) -> Iterator[Tuple]: ... + iter7: Iterable[Any], + *iterables: Iterable[Any]) -> Iterator[Tuple[Any, ...]]: ... +@overload +def product(*iterables: Iterable[Any], repeat: int) -> Iterator[Tuple[Any, ...]]: ... def permutations(iterable: Iterable[_T], r: Optional[int] = ...) -> Iterator[Tuple[_T, ...]]: ...