Posts
A Injeção de Dependência Pode Me Tornar um Programador Python Melhor?
16 de fevereiro de 2025 • 3 min de leitura

A Injeção de Dependência é um pilar em linguagens estáticas, mas faz sentido usá-la em Python? Ela me tornará um programador Python melhor?
E, espera, o que é injeção de dependência, mesmo?
Primeiro, vamos responder à pergunta: O que é injeção de dependência (DI)?
Injeção de dependência é um padrão que, quando usado, move a construção de um objeto para fora da classe. Em vez disso, a classe assume uma dependência de uma abstração.
Em linguagens estáticas como C# e Java, a injeção de dependência é amplamente usada para reduzir o acoplamento e facilitar os testes. Na verdade, você encontrará frameworks de injeção de dependência cujo único propósito é manter dependências e suas relações entre si.
A injeção de dependência serve a dois propósitos principais:
Primeiro, ela reduz a complexidade ao assumir uma dependência de uma abstração.
Segundo, depender de uma abstração permite que diferentes implementações, incluindo mocks para testes, sejam passadas para a classe ou função.
Deixe-me demonstrar com algum 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)
# Depois
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 é a injeção de dependência em sua forma mais simples. Embora o conceito seja direto, seu poder reside em permitir designs flexíveis.
No exemplo Antes
, a classe User
está fortemente acoplada à classe SqlServerDatabase
. Se quisermos testar a classe User
, precisamos criar uma nova instância de SqlServerDatabase
.
No exemplo Depois
, a classe User
está fracamente acoplada à abstração Database
. Podemos passar uma implementação diferente da abstração Database
para a classe User
.
Deixe-me demonstrar essa flexibilidade com um exemplo prático que mostra como podemos alternar entre diferentes implementações de banco de dados:
date_string = "2023-10-01" # Exemplo de string de data
date_format = "%Y-%m-%d" # Formato da string 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)
Na linha 6 (birthday < turn_of_the_century
), a injeção de dependência nos permite trocar implementações facilmente com base em diferentes condições. Embora essa flexibilidade seja valiosa para código de produção, um dos usos mais comuns para injeção de dependência, especialmente em linguagens estáticas, é em testes.
Aqui está um exemplo:
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 é um exemplo simples usando uma classe MockDatabase
. Em Python, também poderíamos usar a classe Mock
integrada para alcançar o mesmo resultado.
Curiosamente, a injeção de dependência não era amplamente usada nos projetos Python em que trabalhei. Vindo de um background de linguagens estáticas, fiquei surpreso— e parecia contraintuitivo.
No entanto, há uma razão para essa adoção limitada. A funcionalidade de patch integrada do Python já fornece excelentes capacidades de teste, eliminando um dos principais benefícios da injeção de dependência. Embora a Injeção de Dependência ainda possa ajudar a reduzir a complexidade, Python tem outras abordagens para alcançar o mesmo objetivo.
Não estou dizendo que a Injeção de Dependência não deveria ser usada em Python. Muito pelo contrário, como todas as ferramentas e padrões, há um lugar e momento para usá-los. E a Injeção de Dependência é apenas mais uma ferramenta em seu arsenal que melhorará a qualidade do seu código.
Acredito que a Injeção de Dependência geralmente aumentaria a qualidade do código na maioria dos projetos Python.
Se você está interessado em explorar mais a Injeção de Dependência, recomendo verificar dois frameworks Python populares:
- Injector (github.com/python-injector/injector)
- Dependency Injector (python-dependency-injector.ets-labs.org)
Autor: Chuck Conway é especialista em engenharia de software e IA Generativa. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube.