python / python/typeshed

Empty Collection Handling with `next`

Offen
#12,064 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

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

There are some issues when using next when providing an empty collection as a default, let's take this example:

from collections.abc import Iterable


def foo(iter: Iterable[list[int]]) -> None:
    next((item for item in iter if len(item) > 5), [])

This leads to errors in Pyright, as [] is treated as list[unknown]. Pyright Playground.

Here are the current next overloads:

@overload
def next(i: SupportsNext[_T], /) -> _T: ...
@overload
def next(i: SupportsNext[_T], default: _VT, /) -> _T | _VT: ...

I would propose changing the second one to:

def next(i: SupportsNext[_T], default: _VT | _T, /) -> _T | _VT: ...

This would fix the above issue, as in the case an empty list or othe rcollection Pyright could just infer the type as _T, while not disrupting other cases in which the types differ.

With this change in Pyright:

from typing import reveal_type

def foo(iter: Iterable[list[int]]) -> None:
    result = next((item for item in iter if len(item) > 5), [])
    reveal_type(result) # Revealed type is `list[int]`.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit den beiden aktuellen next-Überladungen, die im Issue gezeigt werden, und reproduziere das Beispiel im verlinkten Pyright Playground. Vergleiche den inferierten Typ mit der Erwartung von reveal_type; fertig ist die Aufgabe, wenn der leere Default akzeptiert wird und das Ergebnis als list[int] inferiert wird, ohne Fälle mit unterschiedlichen Default-Typen zu beeinträchtigen.

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
52/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.