Skip to content

Publicaciones

¿Puede la Inyección de Dependencias Hacerme un Mejor Programador de Python?

16 de febrero de 2025 • 4 min de lectura

¿Puede la Inyección de Dependencias Hacerme un Mejor Programador de Python?

¿La Inyección de Dependencias es un elemento fundamental en lenguajes estáticos, pero tiene sentido usarla en Python? ¿Me hará un mejor programador de Python?

Y, espera, ¿qué es la inyección de dependencias, de nuevo?

Primero, respondamos la pregunta: ¿Qué es la inyección de dependencias (DI)?

La inyección de dependencias es un patrón que, cuando se usa, mueve la construcción de un objeto fuera de la clase. En su lugar, la clase toma una dependencia de una abstracción.

En lenguajes estáticos como C# y Java, la inyección de dependencias se usa ampliamente para reducir el acoplamiento y facilitar las pruebas. De hecho, encontrarás marcos de inyección de dependencias cuyo único propósito es mantener las dependencias y sus relaciones entre sí.

La inyección de dependencias sirve dos propósitos principales:

Primero, reduce la complejidad al tomar una dependencia de una abstracción.

Segundo, depender de una abstracción permite que diferentes implementaciones, incluidas simulaciones para pruebas, se pasen a la clase o función.

Permíteme demostrar con algo de código:

# Before 
class User:
    def __init__(self):
        self.database = SqlServerDatabase()

    def get_details(self, user_id: int):
        self.database.get_user_details(user_id)

# After  
class User:
    def __init__(self, database: Database):
        self.database = database

    def get_details(self, user_id: int):
        self.database.get_user_details(user_id)

Esta es la inyección de dependencias en su forma más simple. Aunque el concepto es sencillo, su poder radica en permitir diseños flexibles.

En el ejemplo Before, la clase User está fuertemente acoplada a la clase SqlServerDatabase. Si queremos probar la clase User, necesitamos crear una nueva instancia de SqlServerDatabase.

En el ejemplo After, la clase User está débilmente acoplada a la abstracción Database. Podemos pasar una implementación diferente de la abstracción Database a la clase User.

Permíteme demostrar esta flexibilidad con un ejemplo práctico que muestra cómo podemos cambiar entre diferentes implementaciones de base de datos:

date_string = "2023-10-01"  # Example date string
date_format = "%Y-%m-%d"    # Input string format
birthday = datetime.strptime(date_string, date_format) 
turn_of_the_century = datetime.strptime('2000-01-01', date_format)

database = PostgresDatabase("")

if birthday < turn_of_the_century:
    database = SqlServerDatabase("")

user = User(database=database)
user.get_details(user_id=1)

En la línea 6 (birthday < turn_of_the_century), la inyección de dependencias nos permite cambiar implementaciones fácilmente según diferentes condiciones. Aunque esta flexibilidad es valiosa para el código de producción, uno de los usos más comunes de la inyección de dependencias, especialmente en lenguajes estáticos, es en las pruebas.

Aquí hay un ejemplo:

class UserTests(unittest.TestCase):
    def test_is_authenticated(self):
        database = MockDatabase('connection_string')
        
        is_authenticated = User(database).is_authenticated('user', 'pass')

        self.assertTrue(is_authenticated)

Este es un ejemplo simple usando una clase MockDatabase. En Python, también podríamos usar la clase Mock integrada para lograr el mismo resultado.

Curiosamente, la inyección de dependencias no se usaba ampliamente en los proyectos de Python en los que he trabajado. Viniendo de un trasfondo de lenguajes estáticos, me sorprendió—y parecía contraintuitivo.

Sin embargo, hay una razón para esta adopción limitada. La funcionalidad de parche integrada de Python ya proporciona excelentes capacidades de prueba, eliminando uno de los principales beneficios de la inyección de dependencias. Aunque la Inyección de Dependencias aún puede ayudar a reducir la complejidad, Python tiene otros enfoques para lograr el mismo objetivo.

No estoy diciendo que la Inyección de Dependencias no deba usarse en Python. Todo lo contrario, como todas las herramientas y patrones, hay un lugar y un momento para usarlos. Y la Inyección de Dependencias es solo otra herramienta en tu caja de herramientas que mejorará la calidad de tu código.

Creo que la Inyección de Dependencias generalmente aumentaría la calidad del código en la mayoría de los proyectos de Python.

Si estás interesado en explorar la Inyección de Dependencias más a fondo, te recomiendo que consultes dos marcos populares de Python:

  • Injector (github.com/python-injector/injector)
  • Dependency Injector (python-dependency-injector.ets-labs.org)

Autor: Chuck Conway es un Ingeniero de IA con casi 30 años de experiencia en ingeniería de software. Construye sistemas de IA prácticos—canalizaciones de contenido, agentes de infraestructura y herramientas que resuelven problemas reales—y comparte lo que está aprendiendo en el camino. Conéctate con él en redes sociales: X (@chuckconway) o visítalo en YouTube y en SubStack.

↑ Volver arriba

También te puede interesar