¿Puede la Inyección de Dependencias Hacerme un Mejor Programador de Python?
16 de febrero de 2025 • 4 min de lectura

La Inyección de Dependencias es un pilar 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, otra vez?
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 frameworks de inyección de dependencias cuyo único propósito es mantener las dependencias y sus relaciones entre sí.
La inyección de dependencias sirve para 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, incluyendo mocks para pruebas, sean pasadas a la clase o función.
Permíteme demostrarlo con algo de código:
# Antes
class User:
def __init__(self):
self.database = SqlServerDatabase()
def get_details(self, user_id: int):
self.database.get_user_details(user_id)
# Después
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 directo, su poder radica en permitir diseños flexibles.
En el ejemplo Antes
, 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 Después
, 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" # Ejemplo de cadena de fecha
date_format = "%Y-%m-%d" # Formato de cadena de entrada
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 intercambiar implementaciones fácilmente basándose en diferentes condiciones. Aunque esta flexibilidad es valiosa para el código de producción, uno de los usos más comunes para la inyección de dependencias, especialmente en lenguajes estáticos, es en las pruebas.
Aquí tienes 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
incorporada 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 patch incorporada en 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 debería usarse en Python. Todo lo contrario, como todas las herramientas y patrones, hay un lugar y momento para usarlos. Y la Inyección de Dependencias es solo otra herramienta en tu cinturón 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 proyectos de Python.
Si estás interesado en explorar más la Inyección de Dependencias, recomiendo revisar dos frameworks populares de Python:
- Injector (github.com/python-injector/injector)
- Dependency Injector (python-dependency-injector.ets-labs.org)