Estructura switch
A partir de Python 3.10, Python incluye una estructura de control nativa llamada match-case (Structural Pattern Matching). Esta sentencia cumple el rol del clásico switch-case presente en lenguajes como C, Java o JavaScript, pero con capacidades mucho más avanzadas como la desestructuración de secuencias y objetos.
Para versiones anteriores a Python 3.10 o para arquitecturas funcionales específicas, también es común simular este comportamiento mediante diccionarios de funciones o cadenas if-elif-else.
1. La estructura moderna: match-case (Python 3.10+) #
La sintaxis match-case compara una expresión contra uno o más patrones definidos en bloques case.
Ejemplo básico de match-case #
1dia = 2 2 3match dia: 4 case 1: 5 mensaje = "Hoy es lunes" 6 case 2: 7 mensaje = "Hoy es martes" 8 case 3: 9 mensaje = "Hoy es miércoles" 10 case 4: 11 mensaje = "Hoy es jueves" 12 case 5: 13 mensaje = "Hoy es viernes" 14 case 6 | 7: 15 mensaje = "¡Es fin de semana!" 16 case _: 17 mensaje = "Día no válido" 18 19print(mensaje)Salida de consola Hoy es martes
Elementos clave de match-case: #
case valor:: Evalúa una coincidencia exacta de valor o tipo.- Operador OR (
|): Permite agrupar múltiples patrones en una sola línea (ej.case 6 | 7:). - Comodín por defecto (
case _:): Actúa como eldefaultde otros lenguajes o elelsefinal; captura cualquier valor no contemplado anteriormente.
2. Características avanzadas de match-case #
Guardas de condición (if en el case) #
Puedes añadir condiciones adicionales a un patrón mediante la cláusula if:
1puntuacion = 85 2 3match puntuacion: 4 case p if p >= 90: 5 calificacion = "Sobresaliente" 6 case p if p >= 70: 7 calificacion = "Notable" 8 case p if p >= 50: 9 calificacion = "Aprobado" 10 case _: 11 calificacion = "Suspenso" 12 13print(f"Resultado: {calificacion}")Salida de consola Resultado: Notable
Desestructuración de estructuras complejas (Tuplas, Listas o Diccionarios) #
A diferencia del switch clásico de otros lenguajes, match-case en Python permite inspeccionar la forma interna de los datos:
1comando = ("mover", 10, 20) 2 3match comando: 4 case ("salir",): 5 print("Finalizando programa...") 6 case ("mover", x, y): 7 print(f"Moviendo a las coordenadas X={x}, Y={y}") 8 case ("girar", angulo): 9 print(f"Girando {angulo} grados") 10 case _: 11 print("Comando no reconocido")Salida de consola Moviendo a las coordenadas X=10, Y=20
3. Alternativas históricas / compatibles (< Python 3.10) #
Si trabajas con código heredado o versiones anteriores a Python 3.10, existen dos métodos clásicos para simular un switch:
A) Simulación con Diccionarios de funciones (Patrón Dispatcher) #
1def lunes(): 2 return "Hoy es lunes" 3 4def martes(): 5 return "Hoy es martes" 6 7def miercoles(): 8 return "Hoy es miércoles" 9 10def dia_invalido(): 11 return "Día no válido" 12 13# Mapeo clave -> función 14switch_dias = { 15 1: lunes, 16 2: martes, 17 3: miercoles, 18} 19 20dia = 2 21# Obtenemos la función y la ejecutamos con () 22mensaje = switch_dias.get(dia, dia_invalido)() 23print(mensaje)Salida de consola Hoy es martes
B) Cadena if-elif-else #
1dia = 3 2 3if dia == 1: 4 mensaje = "Hoy es lunes" 5elif dia == 2: 6 mensaje = "Hoy es martes" 7elif dia == 3: 8 mensaje = "Hoy es miércoles" 9else: 10 mensaje = "Día no válido" 11 12print(mensaje)Salida de consola Hoy es miércoles
4. ¿Cuál deberías utilizar? #
| Enfoque | Cuándo utilizarlo |
|---|---|
match-case | Recomendado en Python 3.10+. Ideal para comparar valores, patrones de tuplas/listas/dicts y reglas con guardas. |
| Diccionarios | Excelente para tablas de despacho dinámicas donde las acciones se registran o configuran en tiempo de ejecución. |
if-elif-else | Para comparaciones condicionales simples o rangos numéricos heterogéneos en versiones antiguas. |
Resumen del tema
Conceptos clave #
match-case(Python 3.10+): estructura nativa de coincidencia de patrones estructurales (Structural Pattern Matching).- Sintaxis fundamental:
case valor:coincidencia directa.case a | b:coincidencia múltiple (OR).case _:patrón comodín por defecto (default/catch-all).case variable if condicion:guardas lógicas adicionales.
- Desestructuración: permite desempaquetar y validar simultáneamente tuplas, listas, diccionarios y objetos de clases.
- Compatibilidad histórica: simulación mediante mapeo en diccionarios
dispatcher.get(clave, default)()o cadenasif-elif-else.
Qué debes recordar #
Usa la sentencia nativa match / case (Python 3.10+) con case _ como cláusula por defecto para escribir bifurcaciones y desestructuraciones limpias y tipadas.