From 0f3fc83e74dd350fb56ba6bfb0a12780e28d527a Mon Sep 17 00:00:00 2001 From: Matthias Kramm Date: Mon, 5 Jun 2017 13:15:55 -0700 Subject: [PATCH 1/3] make itertools.product more precise --- stdlib/2/itertools.pyi | 38 ++++++++++++++++++++++++++++--- stdlib/3/itertools.pyi | 51 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 85 insertions(+), 4 deletions(-) diff --git a/stdlib/2/itertools.pyi b/stdlib/2/itertools.pyi index 4d9edbc327eb..489d739650b9 100644 --- a/stdlib/2/itertools.pyi +++ b/stdlib/2/itertools.pyi @@ -93,9 +93,41 @@ def izip(iter1: Iterable[Any], iter2: Iterable[Any], def izip_longest(*p: Iterable[Any], fillvalue: Any = ...) -> Iterator[Any]: ... -# TODO: Return type should be Iterator[Tuple[..]], but unknown tuple shape. -# Iterator[Sequence[_T]] loses this type information. -def product(*p: Iterable[_T], repeat: int = ...) -> Iterator[Sequence[_T]]: ... +@overload +def product(iter1: Iterable[_T1]) -> Iterator[Tuple[_T1]]: ... +@overload +def product(iter1: Iterable[_T1], + iter2: Iterable[_T2]) -> Iterator[Tuple[_T1, _T2]]: ... +@overload +def product(iter1: Iterable[_T1], + iter2: Iterable[_T2], + iter3: Iterable[_T3]) -> Iterator[Tuple[_T1, _T2, _T3]]: ... +@overload +def product(iter1: Iterable[_T1], + iter2: Iterable[_T2], + iter3: Iterable[_T3], + 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]) -> 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]) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ... +@overload +def product(iter1: Iterable[_T1], + iter2: Iterable[_T2], + iter3: Iterable[_T3], + iter4: Iterable[_T4], + iter5: Iterable[_T5], + iter6: Iterable[_T6], + iter7: Iterable[_T7], *iterables: Iterable) -> Iterator[Tuple]: ... def permutations(iterable: Iterable[_T], r: int = ...) -> Iterator[Sequence[_T]]: ... diff --git a/stdlib/3/itertools.pyi b/stdlib/3/itertools.pyi index 3e4379a03309..9fce43e4557d 100644 --- a/stdlib/3/itertools.pyi +++ b/stdlib/3/itertools.pyi @@ -51,7 +51,56 @@ def tee(iterable: Iterable[_T], n: int = ...) -> Tuple[Iterator[_T], ...]: ... def zip_longest(*p: Iterable[Any], fillvalue: Any = ...) -> Iterator[Any]: ... -def product(*p: Iterable[_T], repeat: int = ...) -> Iterator[Tuple[_T, ...]]: ... +_T1 = TypeVar('_T1') +_T2 = TypeVar('_T2') +_T3 = TypeVar('_T3') +_T4 = TypeVar('_T4') +_T5 = TypeVar('_T5') +_T6 = TypeVar('_T6') +_T7 = TypeVar('_T7') + +@overload +def product(iter1: Iterable[_T1], *, + repeat:int = ...) -> Iterator[Tuple[_T1]]: ... +@overload +def product(iter1: Iterable[_T1], + iter2: Iterable[_T2], *, + repeat:int = ...) -> Iterator[Tuple[_T1, _T2]]: ... +@overload +def product(iter1: Iterable[_T1], + iter2: Iterable[_T2], + iter3: Iterable[_T3], *, + repeat:int = ...) -> 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]]: ... +@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]]: ... +@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]]: ... +@overload +def product(iter1: Iterable[_T1], + iter2: Iterable[_T2], + iter3: Iterable[_T3], + iter4: Iterable[_T4], + iter5: Iterable[_T5], + iter6: Iterable[_T6], + iter7: Iterable[_T7], *iterables: Iterable, + repeat:int = ...) -> Iterator[Tuple]: ... def permutations(iterable: Iterable[_T], r: Optional[int] = ...) -> Iterator[Tuple[_T, ...]]: ... From 3cfed279cee8ac53a585cf9c96ffaa75406c8ab9 Mon Sep 17 00:00:00 2001 From: Matthias Kramm Date: Mon, 5 Jun 2017 13:26:14 -0700 Subject: [PATCH 2/3] remove unnecessary _T7 --- stdlib/2/itertools.pyi | 14 +++++++------- stdlib/3/itertools.pyi | 15 +++++++-------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/stdlib/2/itertools.pyi b/stdlib/2/itertools.pyi index 489d739650b9..284047763a78 100644 --- a/stdlib/2/itertools.pyi +++ b/stdlib/2/itertools.pyi @@ -121,13 +121,13 @@ def product(iter1: Iterable[_T1], iter5: Iterable[_T5], iter6: Iterable[_T6]) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ... @overload -def product(iter1: Iterable[_T1], - iter2: Iterable[_T2], - iter3: Iterable[_T3], - iter4: Iterable[_T4], - iter5: Iterable[_T5], - iter6: Iterable[_T6], - iter7: Iterable[_T7], *iterables: Iterable) -> Iterator[Tuple]: ... +def product(iter1: Iterable[Any], + iter2: Iterable[Any], + iter3: Iterable[Any], + iter4: Iterable[Any], + iter5: Iterable[Any], + iter6: Iterable[Any], + iter7: Iterable[Any], *iterables: Iterable) -> Iterator[Tuple]: ... def permutations(iterable: Iterable[_T], r: int = ...) -> Iterator[Sequence[_T]]: ... diff --git a/stdlib/3/itertools.pyi b/stdlib/3/itertools.pyi index 9fce43e4557d..7fe6a52cceb0 100644 --- a/stdlib/3/itertools.pyi +++ b/stdlib/3/itertools.pyi @@ -57,7 +57,6 @@ _T3 = TypeVar('_T3') _T4 = TypeVar('_T4') _T5 = TypeVar('_T5') _T6 = TypeVar('_T6') -_T7 = TypeVar('_T7') @overload def product(iter1: Iterable[_T1], *, @@ -93,13 +92,13 @@ def product(iter1: Iterable[_T1], iter6: Iterable[_T6], *, repeat:int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ... @overload -def product(iter1: Iterable[_T1], - iter2: Iterable[_T2], - iter3: Iterable[_T3], - iter4: Iterable[_T4], - iter5: Iterable[_T5], - iter6: Iterable[_T6], - iter7: Iterable[_T7], *iterables: Iterable, +def product(iter1: Iterable[Any], + iter2: Iterable[Any], + iter3: Iterable[Any], + iter4: Iterable[Any], + iter5: Iterable[Any], + iter6: Iterable[Any], + iter7: Iterable[Any], *iterables: Iterable, repeat:int = ...) -> Iterator[Tuple]: ... def permutations(iterable: Iterable[_T], From d9062c14aa03fa47a41095249f016f82330cf448 Mon Sep 17 00:00:00 2001 From: Matthias Kramm Date: Mon, 5 Jun 2017 14:33:22 -0700 Subject: [PATCH 3/3] make flake8 happy. --- stdlib/3/itertools.pyi | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/stdlib/3/itertools.pyi b/stdlib/3/itertools.pyi index 7fe6a52cceb0..1f79cd2570f0 100644 --- a/stdlib/3/itertools.pyi +++ b/stdlib/3/itertools.pyi @@ -60,29 +60,29 @@ _T6 = TypeVar('_T6') @overload def product(iter1: Iterable[_T1], *, - repeat:int = ...) -> Iterator[Tuple[_T1]]: ... + repeat: int = ...) -> Iterator[Tuple[_T1]]: ... @overload def product(iter1: Iterable[_T1], iter2: Iterable[_T2], *, - repeat:int = ...) -> Iterator[Tuple[_T1, _T2]]: ... + repeat: int = ...) -> Iterator[Tuple[_T1, _T2]]: ... @overload def product(iter1: Iterable[_T1], iter2: Iterable[_T2], iter3: Iterable[_T3], *, - repeat:int = ...) -> Iterator[Tuple[_T1, _T2, _T3]]: ... + repeat: int = ...) -> 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]]: ... + repeat: int = ...) -> 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]]: ... + repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5]]: ... @overload def product(iter1: Iterable[_T1], iter2: Iterable[_T2], @@ -90,7 +90,7 @@ def product(iter1: Iterable[_T1], iter4: Iterable[_T4], iter5: Iterable[_T5], iter6: Iterable[_T6], *, - repeat:int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ... + repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ... @overload def product(iter1: Iterable[Any], iter2: Iterable[Any], @@ -99,7 +99,7 @@ def product(iter1: Iterable[Any], iter5: Iterable[Any], iter6: Iterable[Any], iter7: Iterable[Any], *iterables: Iterable, - repeat:int = ...) -> Iterator[Tuple]: ... + repeat: int = ...) -> Iterator[Tuple]: ... def permutations(iterable: Iterable[_T], r: Optional[int] = ...) -> Iterator[Tuple[_T, ...]]: ...