Mypy does not narrow class type when a `→ NoReturn` (`→ Never`) member method is called
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 20.6k
- Fork
- 3.3k
- Metriche di merge delle PR
- Metriche PR in attesa
Descrizione
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
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia con l’esempio Python minimo nell’issue o con il gist mypy-play collegato e riproduci l’assert_type finale che fallisce. Traccia il modo in cui mypy restringe le union dopo metodi membro annotati con NoReturn o Never. È completato quando l’asserzione finale viene accettata, mantenendo corretto il comportamento di restringimento esistente; la descrizione non indica alcun file di implementazione né alcun test.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- compilers
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Ferma
- Chiarezza
- Specificata chiaramente
- Idoneità per principianti
- 45/100