Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Despacho según el nombre del archivo Python: Polimorfismo

Cada entorno — desarrollo, pruebas o producción — necesita su propia configuración. Editar archivos cada vez es riesgoso y poco práctico.

Con el dispatchig por nombre de archivo, puedes cargar automáticamente la configuración adecuada según el entorno. En esta lección verás cómo hacerlo en Python, de forma sencilla y segura.

¿Qué es la dispatchig por nombre de archivo?

Es una estrategia que nos permite tomar decisiones automáticas basadas en el nombre o extensión de un archivo. Esto se usa mucho a la hora de escoger cuál configuración o lógica aplicar, dependiendo del contexto.

Por ejemplo, según el entorno donde estemos ejecutando nuestra aplicación, podemos cargar el archivo de configuración correcto simplemente usando una parte del nombre del archivo.


Ejemplo: configuración por entorno

Supongamos que estamos trabajando en una aplicación y tenemos tres entornos:

💻 Desarrollo (development)

🔍 Pruebas (test)

  • Producción (production)

Tenemos tres archivos de configuración distintos, uno para cada entorno. Su estructura está organizada así:

configs/
  database.development.json
  database.production.json
  database.test.json

Cada uno de estos archivos contiene los datos necesarios para conectarse a la base de datos en ese entorno específico.


Opción 1: Usar un diccionario para escoger el archivo adecuado

Podemos usar un dict de Python para relacionar cada entorno con su archivo de configuración:

import json

# Diccionario con los nombres de archivos por entorno
config_file_by_env_name = {
    "development" : "database.development.json",
    "production"  : "database.production.json",
    "test"        : "database.test.json"
}

config = None
env_name = "production"  # Aquí indicamos en qué entorno estamos

# Buscamos el nombre del archivo de configuración correspondiente
filename = config_file_by_env_name.get(env_name)

if filename is not None:
    with open(filename, "r") as fd:
        config = json.load(fd)
else:
    raise Exception("Configuración no válida: el entorno no existe")

✅  Este método funciona y es fácil de entender.

❌  Pero tiene dos problemas:

  • Si agregamos un nuevo entorno, tenemos que modificar el diccionario.
  • Si cometemos un error al escribir el nombre del archivo, Python lanzará un error al no encontrar el archivo.

Opción 2: Dispatchig por nombre de archivo con plantillas

Una forma más elegante y práctica es construir el nombre del archivo automáticamente usando una plantilla. En Python podemos hacerlo con una f-string:

import json

env_name = "production"  # El entorno actual

filename = f"database.{env_name}.json"  # Construimos el nombre del archivo

with open(filename, "r") as fd:
    config = json.load(fd)

¿Qué hicimos aquí?

  • Creamos el nombre del archivo como una cadena dinámica.
  • No necesitamos un diccionario.
  • Podemos añadir entornos nuevos sin tocar el código, solo creando un nuevo archivo con el nombre adecuado.
Esto es lo que se llama dispatchig por nombre de archivo, porque Python “decide” qué archivo abrir según cómo está compuesto su nombre.

Otros usos de la dispatchig por nombre

Este método no solo sirve para configuraciones. También lo podemos usar en:

Acción Descripción
Procesamiento por tipo de archivo Elegimos una función distinta según si el archivo es .csv, .json o .xml
Selección de plantillas de email Usamos email.bienvenido.txt o email.reset_password.txt
Traducciones por idioma Cargamos messages.en.json o messages.es.json dependiendo del idioma

Básicamente, siempre que podamos identificar algo diferenciador en el nombre del archivo, podemos usar este patrón.


¿Y qué pasa si no encontramos el archivo?

Como buena práctica, deberíamos verificar si el archivo realmente existe antes de intentar abrirlo. Podríamos usar el módulo os.path para eso:

import os
import json

env_name = "production"
filename = f"database.{env_name}.json"

if os.path.exists(filename):
    with open(filename, "r") as fd:
        config = json.load(fd)
else:
    raise FileNotFoundError(f"No se encontró el archivo: {filename}")

Esto nos ayuda a detectar errores con anticipacion y mostrar mensajes claros si falta algún archivo.



Resumen

  • A veces necesitamos usar diferentes archivos de configuración según el entorno.
  • La dispatchig por nombre de archivo nos permite decidir qué archivo usar solo cambiando una parte del nombre.
  • En Python, podemos usar f-strings para generar nombres de archivo dinámicamente y así evitar mantenimientos tediosos.
  • Esta técnica es útil en muchos otros contextos más allá de la configuración, como plantillas, traducciones y procesamiento de archivos.
  • Siempre debemos verificar si el archivo existe antes de abrirlo para evitar errores en tiempo de ejecución.

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY