python / python/mypy

Mypy does not narrow class type when a `→ NoReturn` (`→ Never`) member method is called

Aperta
#14,989 0 commenti 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

feature topic-type-narrowing
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

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. 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

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.