Union interacts poorly with `isinstance`-based unreachability
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Python
- Estrellas
- 20.6k
- Forks
- 3.3k
- Merge medio
- 1 d 18 h
- PR fusionados (30 d)
- 54
Descripción
Bug Report
This is probably already a bug report but the only place I know where this was mentioned was https://github.com/python/mypy/pull/13607#issuecomment-1236357236.
Including | None in a type makes isinstance type narrowing incorrectly report unreachability. This isn't only a problem with | None.
To Reproduce
class SymbolTableNode: pass
class FuncBase: pass
def bad(node: SymbolTableNode | None) -> None:
assert isinstance(node, FuncBase)
reveal_type(node) # unreachable
def good(node: SymbolTableNode) -> None:
assert isinstance(node, FuncBase)
reveal_type(node) # <subclass of SymbolTableNode and FuncBase>
Expected Behavior
No unreachable statements.
Actual Behavior
Unreachable reveal_type(node).
Your Environment
Reproduced in mypy-play.
- Mypy version used: 1.18.2
- Mypy command-line flags:
--warn-unreachable - Mypy configuration options from
mypy.ini(and other config files): N/A - Python version used: 3.12
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 proporcionado en mypy-play usando mypy 1.18.2 y --warn-unreachable, comparando el caso Union | None con el caso sin Union. Rastrea el comportamiento de narrowing basado en isinstance; se considera terminado cuando reveal_type(node) no se reporta como inalcanzable en el ejemplo con Union, mientras el narrowing esperado permanece intacto.
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
- Bien especificado
- Aptitud para principiantes
- 45/100