Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

Irrefutable pattern before the last case in a match statement passes type checking but is a SyntaxError at runtime

Abierto
#21,925 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
3/5
Tiempo estimado
1-2 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python
Área
compilers

Línea de trabajo

Comienza con los ejemplos de repro.py y compara mypy repro.py con la compilación de Python 3.13, incluidas las capturas con guardas y los or-patterns anidados. Sigue la validación existente de or-patterns y añade la comprobación que falta para detectar patrones inalcanzables; se considera terminado cuando mypy informe de los patrones irrefutables no finales inválidos y acepte los casos válidos con guardas o finales.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

bug topic-reachability

Bug Report

mypy reports nothing for match statements that CPython rejects at compile time with SyntaxError: name capture 'y' makes remaining patterns unreachable. An unguarded capture or wildcard pattern in any case except the last one makes the remaining cases unreachable, so the compiler refuses the file, but mypy checks it clean. That means a file that cannot even be imported passes type checking.

The same applies to an irrefutable alternative in a non-final position of an or pattern, e.g. case _ | 1:, which CPython rejects wherever the or pattern appears, including nested inside sequence, mapping and class patterns.

To Reproduce

def f(x: int) -> str:
    match x:
        case y:
            return "capture"
        case _:
            return "wildcard"

Expected Behavior

An error on case y:, matching the runtime behavior:

$ python repro.py
  File "repro.py", line 3
    case y:
         ^
SyntaxError: name capture 'y' makes remaining patterns unreachable

For reference, a case is fine if it has a guard (case y if y > 0:), and an irrefutable pattern in the last case is fine. Inside an or pattern an irrefutable alternative is only allowed in the last position, regardless of guards or which case it is in.

Actual Behavior

$ mypy repro.py
Success: no issues found in 1 source file

mypy already implements the closely related compile time check for or patterns ("Alternative patterns bind different names"), so I think this one is missing rather than intentionally skipped. I have a fix ready and will put up a PR shortly.

Your Environment

  • Mypy version used: mypy 2.4.0+dev.3ad6157f9b66e71738bf39cae939aef7c3fd7ea8 (current master, also with --native-parser)
  • Mypy command-line flags: none
  • Mypy configuration options from mypy.ini (and other config files): none
  • Python version used: 3.13.13
Lenguaje dominante
Python
Estrellas
20.6k
Forks
3.3k
Merge medio
1 d 3 h
PR fusionados (30 d)
59

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.

Más de python/mypy

Todos los issues de python/mypy

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.