Mypy does not narrow class type when a `→ NoReturn` (`→ Never`) member method is called
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 20.6k
- Forks
- 3.3k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug Report
This is easier to explain with the minimal example:
To Reproduce
Gist: https://mypy-play.net/?mypy=latest&python=3.11&gist=ee98d7589e833e85b60faabacb777c33
from typing import NoReturn, assert_type
class Ok:
def validate(self) -> None:
pass
class Error:
def validate(self) -> NoReturn:
raise Exception
response: Ok | Error
assert_type(response, Ok | Error)
response.validate()
assert_type(response, Ok)
Expected Behavior
I expect the last assertion to pass: Error.validate() is annotated with NoReturn, so by the last line, response can only be Ok. An Error would already have caused a NoReturn result, and so get ruled out.
Actual Behavior
scratch.py:18: error: Expression is of type "Union[Ok, Error]", not "Ok" [assert-type]
assert_type(response, Ok)
^
Environment
- Mypy version used:
mypy 1.1.1 (compiled: yes) - Mypy command-line flags: none
- Python version used:
3.11.2
[tool.mypy]
allow_redefinition = true
allow_untyped_globals = true
check_untyped_defs = true
pretty = true
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
Beginne mit dem minimalen Python-Beispiel im Issue oder dem darin verlinkten mypy-play-Gist und reproduziere das fehlgeschlagene abschließende assert_type. Verfolge, wie mypy Unions nach Membermethoden mit der Annotation NoReturn oder Never eingrenzt. Erledigt ist es, wenn die abschließende Assertion akzeptiert wird und das bestehende Eingrenzungsverhalten korrekt bleibt; die Beschreibung nennt keine Implementierungsdatei und keinen Test.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- python
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 45/100