Overly broad type inference when using zip(*x) to tranpose 2d iterable
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 5.1k
- Forks
- 2.1k
- Ø Merge
- 1 T. 19 Std.
- Gemergte PRs (30 T.)
- 82
Beschreibung
Description:
When transposing a 2d iterable x: Iterable[Iterable[T]] using zip(*x), I've noticed typeshed's type annotations result in the return type being inferred as zip[tuple[Any, ...]] rather than the expected zip[tuple[T, ...]]. It would be nice if builtins.py^1 had an overload for this use case.
Expected behavior
When x has type Iterable[Iterable[T]], the expression zip(*x) should be inferred as zip[tuple[T, ...]], preserving the element type information through the transpose operation.
Actual behavior
The expression zip(*x) is inferred as zip[tuple[Any, ...]].
Possible solution
Add the following overloads to zip:
Pre 3.10:
@overload
def __new__(
cls,
*iterables: Iterable[_T1],
) -> zip[tuple[_T1, ...]]: ...
3.10 or later:
@overload
def __new__(
cls,
*iterables: Iterable[_T1],
*,
strict: bool = ...
) -> zip[tuple[_T1, ...]]: ...
While I have seen zip(*x) in the wild, I have not seen zip(a,b,c,*x) in any environment before, so I don't think it's necessary to write an overload for that edge case.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Öffne stdlib/builtins.pyi bei der verlinkten zip-Definition und vergleiche die vorhandenen Overloads mit den vorgeschlagenen Signaturen für vor 3.10 und 3.10+. Bestätige, dass zip(*x) für Iterable[Iterable[T]] als zip[tuple[T, ...]] statt als zip[tuple[Any, ...]] inferiert wird, während die strikte Behandlung beibehalten wird.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- tooling
- Issue-Typ
- Bug
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 58/100