python / python/mypy

Incompatible type "Type[ImportError]"; expected "Type[Exception]"

Offen
#14,443 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug topic-inference
Vorherrschende Sprache
Python
Sterne
20.6k
Forks
3.3k
PR-Merge-Kennzahlen
PR-Kennzahlen ausstehend

Beschreibung

Bug Report

Mypy appears not to consider ImportError to be an exception type in some cases.

To Reproduce

y = [
    # ValueError,
    ImportError,  # error: List item 0 has incompatible type "Type[ImportError]"; expected "Type[Exception]"  [list-item]
    AttributeError,
]
reveal_type(y)  # note: Revealed type is "builtins.list[def (*args: builtins.object, *, name: Union[builtins.str, None] =, obj: Union[builtins.str, None] =) -> builtins.Exception]"

The ordering of the list elements doesn't seem to impact the behaviour.

If you un-comment the ValueError however:

y = [
    ValueError,
    ImportError,
    AttributeError,
]
reveal_type(y)  # note: Revealed type is "builtins.list[builtins.type]"

While this is perhaps less precise than I'd hope (I'd hope to get list[type[Exception]]) it feels more right to me.

Adding an annotation to the variable (y: list[type[Exception]]) does help mypy see that this is ok, however in my original use-case the list being constructed was passed to a decorator function, so there was no easy opportunity to annotate it.

Your Environment

  • Mypy version used: 0.991
  • Mypy command-line flags: none
  • Mypy configuration options from mypy.ini (and other config files): none
  • Python version used: 3.11

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 bereitgestellte Python-Beispiel mit mypy 0.991 oder einem aktuellen Checkout auszuführen, und vergleiche die abgeleiteten Typen mit und ohne ValueError. Verfolge die Ableitung der Listenelemente und die Behandlung des Exception-Typs. Füge anschließend einen Regressionstest hinzu, der zeigt, dass ImportError in der Liste akzeptiert wird, und überprüfe den erwarteten aufgedeckten Typ.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
tooling
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
38/100

Neue Issues direkt in Ihr Postfach

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