Skip to content

Posts

A Injeção de Dependência Pode Me Tornar um Melhor Programador Python?

16 de fevereiro de 2025 • 3 min de leitura

A Injeção de Dependência Pode Me Tornar um Melhor Programador Python?

A Injeção de Dependência é uma prática comum em linguagens estáticas, mas faz sentido usá-la em Python? Isso me tornará um melhor programador Python?

E, espera aí, o que é injeção de dependência novamente?

Primeiro, vamos responder a 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 depende 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. De fato, você encontrará frameworks de injeção de dependência cujo único propósito é manter as dependências e suas relações entre si.

A injeção de dependência serve dois propósitos principais:

Primeiro, reduz a complexidade ao depender 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:

# 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 é 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 Before, a classe User está fortemente acoplada à classe SqlServerDatabase. Se quisermos testar a classe User, precisamos criar uma nova instância de SqlServerDatabase.

No exemplo After, 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"  # 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)

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, é nos 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 em linguagens estáticas, fiquei surpreso—e parecia contraditório.

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 deva ser usada em Python. Pelo contrário, como todas as ferramentas e padrões, há um lugar e um momento para usá-los. E a Injeção de Dependência é apenas outra ferramenta em seu kit de ferramentas que melhorará a qualidade do seu código.

Acho que a Injeção de Dependência geralmente aumentaria a qualidade do código na maioria dos projetos Python.

Se você estiver interessado em explorar a Injeção de Dependência ainda mais, recomendo verificar dois frameworks Python populares:

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

Autor: Chuck Conway é um Engenheiro de IA com quase 30 anos de experiência em engenharia de software. Ele constrói sistemas de IA práticos—pipelines de conteúdo, agentes de infraestrutura e ferramentas que resolvem problemas reais—e compartilha o que está aprendendo ao longo do caminho. Conecte-se com ele nas redes sociais: X (@chuckconway) ou visite-o no YouTube e no SubStack.

↑ Voltar ao topo

Você também pode gostar