Home / Lenguajes / Como usar switch en Python con match case y alternativas
Como usar switch en Python con match case y alternativas

Como usar switch en Python con match case y alternativas

11 October 2026 · 7 min de lectura ··

Introduccion al control de flujo multiple en Python

La seleccion de distintos bloques de codigo segun el valor de una expresion es una necesidad frecuente en el desarrollo de software. En muchos lenguajes esta necesidad se cubre con una sentencia switch. Durante anos Python no dispuso de una construccion equivalente, y los desarrolladores recurrieron a cadenas de if-elif-else o a diccionarios que mapean valores a funciones. A partir de Python 3.10, el lenguaje incorporo la sentencia match, que implementa el pattern matching estructural y ofrece una alternativa nativa y mas potente que un switch tradicional.

La sentencia match evalua un sujeto y lo compara con una serie de patrones. El primer patron que coincide ejecuta su bloque y el resto se ignora, sin necesidad de una instruccion break. El patron comodín, representado por el guion bajo, actua como caso por defecto. Ademas de comparar literales, match permite deconstruir secuencias, mapeos y objetos, lo que amplia su utilidad mas alla de la simple seleccion por valor.

En esta guia se presentan las formas actuales de implementar un comportamiento similar a switch en Python. Se cubre la sentencia match como opcion preferida en versiones modernas, junto con las alternativas de diccionarios e if-elif que siguen siendo validas en cualquier version y en determinados contextos. Los ejemplos ilustran tanto casos sencillos como patrones mas elaborados.

Concepto de match y pattern matching estructural

La sentencia match compara el resultado de una expresion con una secuencia de patrones. Cada patron aparece en una clausula case. Cuando un patron coincide, se ejecuta el bloque asociado y la sentencia termina. No existe caida a traves de casos, a diferencia de algunos lenguajes que requieren break explicito.

def mensaje_estado(codigo):
    match codigo:
        case 200:
            return "OK"
        case 404:
            return "No encontrado"
        case 500:
            return "Error interno"
        case _:
            return "Estado desconocido"

El patron _ coincide con cualquier valor y debe colocarse al final. Es posible agrupar varios literales en un mismo caso mediante el operador |, que actua como disyuncion dentro del patron.

def tipo_dia(dia):
    match dia:
        case "sabado" | "domingo":
            return "Fin de semana"
        case "lunes" | "martes" | "miercoles" | "jueves" | "viernes":
            return "Dia laborable"
        case _:
            return "Valor no reconocido"

Match esta disponible desde Python 3.10. En versiones anteriores la sintaxis produce un error de sintaxis, por lo que el codigo que debe ejecutarse en entornos mixtos puede recurrir a las alternativas clasicas o comprobar la version en tiempo de ejecucion.

Simulacion de switch con if-elif-else

La cadena if-elif-else sigue siendo una forma clara y universal de seleccionar entre multiples condiciones. Cada condicion se evalua en orden hasta que una resulta verdadera. El bloque else actua como caso por defecto.

def obtener_dia(numero):
    if numero == 0:
        return "Domingo"
    elif numero == 1:
        return "Lunes"
    elif numero == 2:
        return "Martes"
    elif numero == 3:
        return "Miercoles"
    elif numero == 4:
        return "Jueves"
    elif numero == 5:
        return "Viernes"
    elif numero == 6:
        return "Sabado"
    else:
        return "Numero invalido"

Esta estructura resulta adecuada cuando el numero de casos es reducido o cuando cada rama contiene logica compleja que no se expresa facilmente como un patron. Con muchos casos, la cadena puede volverse larga y dificil de mantener. En esos escenarios, un diccionario o la sentencia match suelen ofrecer mejor legibilidad.

Uso de diccionarios para mapear valores o funciones

Un diccionario permite asociar claves con valores o con funciones. El metodo get proporciona un valor por defecto cuando la clave no existe, lo que equivale al caso default. Esta tecnica es eficiente porque el acceso a un diccionario tiene coste constante en promedio.

def obtener_dia(numero):
    dias = {
        0: "Domingo",
        1: "Lunes",
        2: "Martes",
        3: "Miercoles",
        4: "Jueves",
        5: "Viernes",
        6: "Sabado"
    }
    return dias.get(numero, "Dia invalido")

Cuando cada caso debe ejecutar una accion distinta, el diccionario puede almacenar funciones. La llamada se realiza despues de recuperar la funcion asociada a la clave.

def accion_a():
    print("Ejecutando accion A")

def accion_b():
    print("Ejecutando accion B")

def accion_c():
    print("Ejecutando accion C")

acciones = {
    "a": accion_a,
    "b": accion_b,
    "c": accion_c
}

opcion = "b"
funcion = acciones.get(opcion)
if funcion is not None:
    funcion()
else:
    print("Opcion no valida")

Esta forma de despacho dinamico es especialmente util cuando las acciones se registran en tiempo de ejecucion o cuando se desea extender el conjunto de opciones sin modificar una cadena de condiciones. El diccionario actua como tabla de salto y mantiene el codigo de seleccion separado de la implementacion de cada accion.

Pattern matching avanzado con match

Match va mas alla de la comparacion de literales. Permite deconstruir secuencias, capturar partes de un valor y aplicar condiciones adicionales mediante guardas. Un patron de secuencia puede extraer elementos y el resto de la coleccion.

def procesar_comando(comando):
    partes = comando.split()
    match partes:
        case ["mostrar"]:
            print("Listando elementos")
        case ["eliminar", *archivos]:
            print(f"Eliminando: {archivos}")
        case _:
            print("Comando no reconocido")

Las guardas se introducen con la palabra if despues del patron. Permiten anadir condiciones que no se expresan unicamente con la estructura del valor.

def clasificar(numero):
    match numero:
        case n if n < 0:
            return "negativo"
        case 0:
            return "cero"
        case n if n < 10:
            return "pequeno"
        case _:
            return "grande"

Es importante recordar que un nombre sin calificar en un patron captura el valor en lugar de compararlo con una variable existente. Para comparar con una constante definida en otro ambito, se debe utilizar un nombre cualificado, como el de un miembro de una enumeracion o un atributo de un modulo.

from enum import Enum

class Color(Enum):
    ROJO = 1
    VERDE = 2

def describir(color):
    match color:
        case Color.ROJO:
            return "Rojo"
        case Color.VERDE:
            return "Verde"
        case _:
            return "Otro"

El orden de los casos importa. Los patrones mas especificos deben aparecer antes que los mas generales, porque el primer patron que coincide es el que se ejecuta.

Ventajas y consideraciones de cada enfoque

La sentencia match ofrece la sintaxis mas cercana a un switch y anade capacidad de deconstruccion. Resulta preferible cuando se trabaja con Python 3.10 o posterior y cuando los casos se basan en la estructura de los datos. Su legibilidad mejora cuando los patrones son claros y el numero de casos es moderado.

Los diccionarios destacan cuando se necesita un mapeo simple de valores a resultados o a funciones, especialmente si el conjunto de opciones puede cambiar en tiempo de ejecucion. El acceso es rapido y el codigo de seleccion permanece compacto.

Las cadenas if-elif-else son universales y explicitas. Resultan adecuadas para un numero pequeno de condiciones o cuando cada rama contiene logica que no se reduce facilmente a un patron o a una funcion simple. Su principal limitacion es la longitud cuando el numero de casos crece.

En todos los casos es recomendable incluir un tratamiento para valores no reconocidos, ya sea mediante un caso por defecto, el metodo get de un diccionario o un bloque else. Validar la entrada antes de la seleccion reduce la posibilidad de errores inesperados.

Buenas practicas al implementar seleccion multiple

Mantener los casos ordenados de mayor a menor especificidad evita que un patron general capture valores que deberian corresponder a un caso mas preciso. En match, colocar el patron _ al final es obligatorio para que actue como default.

Encapsular la logica de cada caso en funciones mejora la modularidad y facilita las pruebas. Tanto en diccionarios como en match, las funciones pueden definirse por separado y asociarse a los casos, lo que reduce la longitud de la estructura de seleccion.

Cuando el codigo debe ejecutarse en versiones anteriores a Python 3.10, las alternativas de diccionario e if-elif garantizan la compatibilidad. En proyectos que pueden exigir una version minima, match se convierte en la opcion preferida por su claridad y potencia.

Documentar el comportamiento ante valores no reconocidos y cubrir los casos limite en las pruebas unitarias refuerza la robustez. Incluir ejemplos de entrada valida e invalida ayuda a otros desarrolladores a comprender el contrato de la funcion.

Conclusiones

Python dispone desde la version 3.10 de la sentencia match, que proporciona un mecanismo nativo de pattern matching estructural y cubre la mayoria de los usos de un switch tradicional, ademas de permitir la deconstruccion de datos complejos. Para versiones anteriores o para mapeos simples, los diccionarios y las cadenas if-elif-else siguen siendo soluciones validas y eficientes.

La eleccion entre estas tecnicas depende de la version de Python disponible, de la complejidad de los casos y de si se necesita deconstruccion o simplemente seleccion por valor. En todos los enfoques, el tratamiento explicito del caso por defecto y la encapsulacion de la logica contribuyen a un codigo legible y mantenible.

Dominar estas formas de control de flujo multiple permite escribir programas que responden de manera ordenada a distintos escenarios. La aplicacion consciente de match en entornos modernos, o de las alternativas clasicas cuando se requiere compatibilidad, mejora la claridad del codigo y facilita su evolucion a lo largo del tiempo.