El Clasificador Moderno (match-case)

Fig. 7.3: match/case: la máquina clasificadora por etiqueta.
El if-elif hace bien su trabajo cuando comparas rangos, pero escribir diez condiciones para valores exactos se vuelve tedioso rápido. Para eso existe La Máquina Clasificadora (match-case): le das una caja, la máquina la gira hasta que la etiqueta encaja con la salida correcta, y listo.
Sintaxis de la Máquina
Python 3.10 introdujo esta forma de tomar decisiones. No es una mejora menor: cambia cómo se lee el código cuando manejas valores discretos.
color_etiqueta = "ROJO"
match color_etiqueta:
case "ROJO":
destino = "Material Peligroso"
case "VERDE":
destino = "Material Seguro"
case "AZUL":
destino = "Refrigerados"
case _:
destino = "Investigar (Desconocido)"
Piezas Clave:
match variable:: El objeto que estamos analizando.case valor:: El túnel de salida correspondiente.case _:: El “Caso por Defecto” (Wildcard). Si no coincide con ninguno anterior, cae aquí (equivalente alelse).
¡Ojo!: la máquina compara tipo Y valor.
"1"(texto) nunca encaja encase 1:(número). Comoinput()siempre entrega texto, un menú numérico necesitaint(input(...))antes delmatch, o patrones con comillas (case "1":). Este es el descarrilamiento más común de la clasificadora.
Y no truena: cae al comodín en silencio, sin avisarte que algo salió mal.
opcion: str = "1" # esto es lo que input() te habría devuelto
match opcion:
case 1:
destino = "Entrada"
case 2:
destino = "Salida"
case _:
destino = "Opción inválida"
print(destino)
# "Opción inválida" ← el 1 nunca coincidió, y no hubo ningún error
Patrones Avanzados (Inspección de Contenidos)
Aquí es donde match deja de ser un atajo cómodo y empieza a hacer trabajo que un if no puede. La máquina no solo compara etiquetas: puede abrir la caja y examinar su estructura interna.
# Un comando recibido por el robot
comando = ["MOVER", "IZQUIERDA"]
match comando:
case ["MOVER", direccion]:
# Captura la segunda palabra en la variable 'direccion'
print(f"Moviendo robot hacia: {direccion}")
case ["DETENER"]:
print("Frenando motores...")
case _:
print("Comando no reconocido")
Se llama “Structural Pattern Matching” (coincidencia de patrones estructurales), y es la razón de que el match exija Python 3.10 o más reciente.
¿Cuándo match y cuándo if/elif?
Tener dos herramientas para decidir no significa que sean intercambiables. Cada una brilla en un terreno distinto, y elegir mal hace el código más difícil de leer, no más fácil.
Quédate con if/elif cuando la decisión es sobre rangos o condiciones: comparar con >, >=, combinar con and/or, preguntar si algo está vacío. El clasificador de puntaje de la sección anterior (>= 90, >= 70) es territorio de if/elif; intentar forzarlo a match sería retorcido.
Saca el match cuando comparas una sola variable contra muchos valores exactos (las etiquetas “ROJO”, “VERDE”, “AZUL”) o cuando necesitas mirar la forma de una estructura: una lista de dos elementos, una tupla de tamaño conocido, un diccionario con tales claves. Ahí el if/elif equivalente serían diez líneas de == encadenados, o un montón de len() y accesos por índice; el match dice lo mismo de un vistazo.
La regla corta: si la pregunta es “¿en cuál de estos túneles exactos cae esto?”, usa match. Si la pregunta es “¿qué tan grande, qué tan lleno, se cumple esto Y aquello?”, usa if/elif.
Resumen del Capítulo
if/elif/elsedesvía el programa según una condición; Python evalúa en orden y ejecuta solo la primera rama verdadera.- La verdad de las cajas (truthiness):
0,"",[],{}yNonecuentan como falsos dentro de unif; casi todo lo demás es verdadero. - Una cláusula de guarda resuelve primero los casos que no aplican y sale de inmediato (
return), dejando el camino principal sin anidar. match/caseclasifica una variable contra múltiples valores exactos o contra la forma de una estructura (listas, tuplas);case _es el comodín por defecto.- La máquina de
matchcompara tipo y valor a la vez:"1"nunca coincide concase 1:. - Elige
if/elifpara rangos y condiciones combinadas; eligematchpara comparar una variable contra valores exactos o inspeccionar la forma de un dato.