python / python/mypy

Union interacts poorly with `isinstance`-based unreachability

Abierto
#20,057 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

bug topic-reachability
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

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. 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

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.