python / python/mypy

Type narrowing of `Any` with `is` can widen type of variable for enum member to `Any`

Offen
#21,667 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

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

Beschreibung

Bug Report

Possibly related to #21364 and other union narrowing, although this occurs without a union.

When the following pattern is used to define a sentinel, strange "narrowing" behavior can occur:

class SentinelType(enum.Enum):
    SENTINEL = enum.auto()
SENTINEL: SentinelType = SentinelType.SENTINEL

If x: Any is narrowed by the comparison x is SENTINEL, mypy will start to treat SENTINEL as having type Any.

This does not happen if the namespaced enum member, SentinelType.SENTINEL is used. Only when a separate variable is used.

To Reproduce

https://mypy-play.net/?gist=174c92c83f84f44b2e8fefdcf5a0cd9b

import enum
import typing as t

class SentinelType(enum.Enum):
    SENTINEL = enum.auto()
SENTINEL: SentinelType = SentinelType.SENTINEL

x: t.Any = None
if x is SENTINEL:
    t.reveal_type(SENTINEL)

Expected Behavior

The type of SENTINEL should not be altered.

Actual Behavior

SENTINEL's revealed type is Any.

Your Environment

  • Mypy version used: 2.0, 2.1
  • Python version used: 3.10, 3.12, 3.14

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 mit dem verlinkten mypy-play-Reproducer und führe ihn mit dem gezeigten Python-Code aus; überprüfe die reveal_type-Ausgabe für SENTINEL innerhalb des is-Zweigs. Verfolge den Typverengungspfad für Vergleiche, an denen Any und ein separat zugewiesenes Enum-Mitglied beteiligt sind; abgeschlossen ist die Aufgabe, wenn SENTINEL seinen deklarierten SentinelType beibehält, statt zu Any zu werden.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
compilers, devtools
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Ruhig
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
68/100

Neue Issues direkt in Ihr Postfach

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