python / python/mypy

Check for return type of overload implementation is too strict?

Offen
#7,338 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

false-positive needs discussion priority-1-normal topic-overloads
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Consider this simplified example:

from typing import overload, Optional, List
  
@overload
def f(x: int) -> List[int]: ...
@overload
def f(x: None) -> List[Optional[int]]: ...

def f(x: Optional[int]) -> List[Optional[int]]:
    return [x]

Mypy currently complains about it that:

Overloaded function implementation cannot produce return type of signature 1

Although I understand why this happens, it is a bit annoying and can be perceived as a false positive. Maybe we should use is_overlapping_types() instead of is_subtype() for the check?

cc @Michael0x2a

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 damit, das vereinfachte Overload-Beispiel zu reproduzieren und die Prüfung des Rückgabetyps der Implementierung in mypy nachzuverfolgen. Vergleiche die aktuelle Prüfung mit is_subtype() mit dem vorgeschlagenen Verhalten von is_overlapping_types() und bestimme anschließend, ob das Beispiel akzeptiert werden sollte, und validiere die Entscheidung mit einer Regressionstestabdeckung.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
compilers, devtools
Issue-Typ
Bug
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

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