python / python/mypy

isinstance wrongly narrows away Any

Offen
#12,290 5 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

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

Beschreibung

Bug Report

Mypy falsely narrows a type when using isinstance with a tuple containing a variable of type Any.
This only happens when there is at least one other element in the tuple.
Note that a class might have type Any if it is imported from an untyped module.

To Reproduce

from typing import Any

class A: 
    pass

B: Any  # (Or from untyped_lib import B)

m: Any

if isinstance(m, (A, B)):
    reveal_type(m)
else:
    reveal_type(m)

Expected Behavior

Mypy reports no error. m is of type Any in both branches

Actual Behavior

The second branch is reported as unreachable.

Your Environment

  • Mypy version used: 0.931
  • Mypy command-line flags: --warn-unreachable
  • Mypy configuration options from mypy.ini (and other config files): None
  • Python version used: 3.10

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, die bereitgestellte Reproduktion mit mypy 0.931, Python 3.10 und --warn-unreachable auszuführen, und verfolge dann die beteiligte isinstance-Eingrenzungslogik, wenn ein Tupel Any enthält. Als erledigt gilt die Aufgabe, wenn das Beispiel m in beiden Zweigen als Any meldet und den else-Zweig nicht mehr als unerreichbar markiert.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
compilers, devtools
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

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