Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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:

  1. match variable:: El objeto que estamos analizando.
  2. case valor:: El túnel de salida correspondiente.
  3. case _:: El “Caso por Defecto” (Wildcard). Si no coincide con ninguno anterior, cae aquí (equivalente al else).

¡Ojo!: la máquina compara tipo Y valor. "1" (texto) nunca encaja en case 1: (número). Como input() siempre entrega texto, un menú numérico necesita int(input(...)) antes del match, 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/else desví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, "", [], {} y None cuentan como falsos dentro de un if; 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/case clasifica 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 match compara tipo y valor a la vez: "1" nunca coincide con case 1:.
  • Elige if/elif para rangos y condiciones combinadas; elige match para comparar una variable contra valores exactos o inspeccionar la forma de un dato.