Skip to content

Commit ed6dc17

Browse files
matthiaskrammJelleZijlstra
authored andcommitted
make itertools.product more precise (#1393)
1 parent ac36193 commit ed6dc17

2 files changed

Lines changed: 84 additions & 4 deletions

File tree

stdlib/2/itertools.pyi

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,41 @@ def izip(iter1: Iterable[Any], iter2: Iterable[Any],
9393
def izip_longest(*p: Iterable[Any],
9494
fillvalue: Any = ...) -> Iterator[Any]: ...
9595

96-
# TODO: Return type should be Iterator[Tuple[..]], but unknown tuple shape.
97-
# Iterator[Sequence[_T]] loses this type information.
98-
def product(*p: Iterable[_T], repeat: int = ...) -> Iterator[Sequence[_T]]: ...
96+
@overload
97+
def product(iter1: Iterable[_T1]) -> Iterator[Tuple[_T1]]: ...
98+
@overload
99+
def product(iter1: Iterable[_T1],
100+
iter2: Iterable[_T2]) -> Iterator[Tuple[_T1, _T2]]: ...
101+
@overload
102+
def product(iter1: Iterable[_T1],
103+
iter2: Iterable[_T2],
104+
iter3: Iterable[_T3]) -> Iterator[Tuple[_T1, _T2, _T3]]: ...
105+
@overload
106+
def product(iter1: Iterable[_T1],
107+
iter2: Iterable[_T2],
108+
iter3: Iterable[_T3],
109+
iter4: Iterable[_T4]) -> Iterator[Tuple[_T1, _T2, _T3, _T4]]: ...
110+
@overload
111+
def product(iter1: Iterable[_T1],
112+
iter2: Iterable[_T2],
113+
iter3: Iterable[_T3],
114+
iter4: Iterable[_T4],
115+
iter5: Iterable[_T5]) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5]]: ...
116+
@overload
117+
def product(iter1: Iterable[_T1],
118+
iter2: Iterable[_T2],
119+
iter3: Iterable[_T3],
120+
iter4: Iterable[_T4],
121+
iter5: Iterable[_T5],
122+
iter6: Iterable[_T6]) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ...
123+
@overload
124+
def product(iter1: Iterable[Any],
125+
iter2: Iterable[Any],
126+
iter3: Iterable[Any],
127+
iter4: Iterable[Any],
128+
iter5: Iterable[Any],
129+
iter6: Iterable[Any],
130+
iter7: Iterable[Any], *iterables: Iterable) -> Iterator[Tuple]: ...
99131

100132
def permutations(iterable: Iterable[_T],
101133
r: int = ...) -> Iterator[Sequence[_T]]: ...

stdlib/3/itertools.pyi

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,55 @@ def tee(iterable: Iterable[_T], n: int = ...) -> Tuple[Iterator[_T], ...]: ...
5151
def zip_longest(*p: Iterable[Any],
5252
fillvalue: Any = ...) -> Iterator[Any]: ...
5353

54-
def product(*p: Iterable[_T], repeat: int = ...) -> Iterator[Tuple[_T, ...]]: ...
54+
_T1 = TypeVar('_T1')
55+
_T2 = TypeVar('_T2')
56+
_T3 = TypeVar('_T3')
57+
_T4 = TypeVar('_T4')
58+
_T5 = TypeVar('_T5')
59+
_T6 = TypeVar('_T6')
60+
61+
@overload
62+
def product(iter1: Iterable[_T1], *,
63+
repeat: int = ...) -> Iterator[Tuple[_T1]]: ...
64+
@overload
65+
def product(iter1: Iterable[_T1],
66+
iter2: Iterable[_T2], *,
67+
repeat: int = ...) -> Iterator[Tuple[_T1, _T2]]: ...
68+
@overload
69+
def product(iter1: Iterable[_T1],
70+
iter2: Iterable[_T2],
71+
iter3: Iterable[_T3], *,
72+
repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3]]: ...
73+
@overload
74+
def product(iter1: Iterable[_T1],
75+
iter2: Iterable[_T2],
76+
iter3: Iterable[_T3],
77+
iter4: Iterable[_T4], *,
78+
repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4]]: ...
79+
@overload
80+
def product(iter1: Iterable[_T1],
81+
iter2: Iterable[_T2],
82+
iter3: Iterable[_T3],
83+
iter4: Iterable[_T4],
84+
iter5: Iterable[_T5], *,
85+
repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5]]: ...
86+
@overload
87+
def product(iter1: Iterable[_T1],
88+
iter2: Iterable[_T2],
89+
iter3: Iterable[_T3],
90+
iter4: Iterable[_T4],
91+
iter5: Iterable[_T5],
92+
iter6: Iterable[_T6], *,
93+
repeat: int = ...) -> Iterator[Tuple[_T1, _T2, _T3, _T4, _T5, _T6]]: ...
94+
@overload
95+
def product(iter1: Iterable[Any],
96+
iter2: Iterable[Any],
97+
iter3: Iterable[Any],
98+
iter4: Iterable[Any],
99+
iter5: Iterable[Any],
100+
iter6: Iterable[Any],
101+
iter7: Iterable[Any], *iterables: Iterable,
102+
repeat: int = ...) -> Iterator[Tuple]: ...
55103

56104
def permutations(iterable: Iterable[_T],
57105
r: Optional[int] = ...) -> Iterator[Tuple[_T, ...]]: ...

0 commit comments

Comments
 (0)