Type narrowing of `Any` with `is` can widen type of variable for enum member to `Any`
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con el reproductor mypy-play enlazado y ejecútalo con el código Python mostrado; comprueba la salida de reveal_type para SENTINEL dentro de la rama is. Traza la ruta de estrechamiento de tipos para las comparaciones que involucren Any y un miembro de enum asignado por separado; se considera terminado cuando SENTINEL conserva su SentinelType declarado en lugar de convertirse en Any.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- compilers, devtools
- Tipo de issue
- Error
- Dificultad
- 3/5
- Tiempo estimado
- 1-2 días
- Estado de actividad
- Tranquilo
- Claridad
- Bien especificado
- Aptitud para principiantes
- 68/100