List[Literal[...]] type being narrowed where it shouldn't be
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
Adding an if check on a specific index of a List of Literals seems to narrow down its scope, even though the list can be modified and the value at that index can change.
To Reproduce
Run mypy over this piece of code:
foo: List[Literal['a', 'b']] = ['a', 'b', 'a']
if foo[0] == 'a':
print('a')
exit()
foo.pop(0)
reveal_type(foo[0])
if foo[0] == 'a':
pass
Expected Behavior
Revealed type to be Literal['a', 'b'], and the conditional to be valid.
Actual Behavior
t.py:11: note: Revealed type is 'Literal['b']'
t.py:12: error: Non-overlapping equality check (left operand type: "Literal['b']", right operand type: "Literal['a']")
Your Environment
- Mypy version used: 0.790
- Mypy command-line flags:
--strict - Python version used: 3.9.1 64-bit
- Operating system and version: Fedora 33 x86_64
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 ejecutando el reproductor de Python proporcionado con mypy 0.790 e inspecciona el comportamiento del estrechamiento de tipos para Lists mutables indexadas de Literals. Sigue el punto de entrada del estrechamiento para foo[0] a través del checker; se considera terminado cuando reveal_type(foo[0]) sigue siendo Literal['a', 'b'] después de pop(0) y la comprobación de igualdad posterior es aceptada.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- devtools
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bien especificado
- Aptitud para principiantes
- 42/100