Nested if Optional checking for class attributes fails
Abierto
Nadie ha tomado este issue todavía.
bug
topic-type-narrowing
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
Checking optional attributes in a class does not persist in a nested if:
(test.py)
#!/usr/bin/env python3
import typing
class Example:
def __init__(self):
self.a: typing.Optional[int]
def check_class(foo: Example, bar: Example):
reveal_type(foo.a)
if foo.a is not None:
reveal_type(foo.a)
if foo.a > 0:
reveal_type(foo.a)
foo = bar
elif foo.a < 0:
reveal_type(foo.a)
foo.a += 1
Output:
$ mypy test.py
test.py:12: note: Revealed type is "Union[builtins.int, None]"
test.py:14: note: Revealed type is "builtins.int"
test.py:16: note: Revealed type is "builtins.int"
test.py:18: error: Unsupported operand types for > ("int" and "None")
test.py:18: note: Left operand is of type "Optional[int]"
test.py:19: note: Revealed type is "Union[builtins.int, None]"
test.py:20: error: Unsupported operand types for + ("None" and "int")
test.py:20: note: Left operand is of type "Optional[int]"
Environment
- Python 3.9.9
- mypy == 0.971
- Linux x86_64
- No other mypy config
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 el ejemplo proporcionado test.py con mypy e inspecciona la salida de reveal_type y los errores reportados en las ramas anidadas. El trabajo estará terminado cuando el narrowing previsto de non-None se gestione de forma coherente allí sin introducir un narrowing incorrecto después de reasignar foo.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- python
- Área
- compilers
- 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