Flow-sensitive typing ignores dictionary key mutation
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
mypy allows runtime type checks for dictionary items. However it ignores subsequent dictionary mutations. This leads to mypy accepting code that fails at runtime.
To Reproduce
from typing import Dict, Optional
foo_dict: Dict[str, Optional[str]] = {'bar': 'baz'}
if foo_dict['bar'] is not None:
foo_dict['bar'] = None
foo_dict['bar'].upper()
Expected Behavior
mypy reports .upper() call as error. This is similar to what already happens with object attributes:
from dataclasses import dataclass
from typing import Optional
@dataclass
class Foo:
bar: Optional[str]
foo = Foo(bar='baz')
if foo.bar is not None:
foo.bar = None
foo.bar.upper()
For such code mypy outputs the following error: "None" has no attribute "upper".
Actual Behavior
mypy reports no error.
Your Environment
- Mypy version used: 0.812
- Mypy command-line flags:
--strict - Mypy configuration options from
mypy.ini(and other config files): none - Python version used: 3.6.8
- Operating system and version: Windows 8.1
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
Empieza ejecutando la reproducción de Python con mypy --strict y compárala con el ejemplo de atributo de dataclass, confirmando que el caso del diccionario se acepta mientras que el caso del atributo se rechaza. Rastrea la lógica de narrowing sensible al flujo para las expresiones de elementos de diccionario y añade cobertura para la mutación; estará terminado cuando mypy informe de la llamada a .upper() como un error.
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
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 45/100