Novo post no blog 🐍
Você provavelmente já escreveu o mesmo try/finally dezenas de vezes para fechar conexão, liberar lock, limpar recurso. Funciona. Mas quando a lógica de encerramento muda, você caça essa duplicação pelo projeto inteiro.
O artigo mostra como criar context managers próprios — com __enter__/__exit__ e com @contextmanager — e três padrões que resolvem isso em produção.

Você provavelmente não precisa desse try/finally
Existe um padrão que aparece em quase todo projeto Python com mais de algumas semanas de vida. Ele tem variações, mas o esqueleto é sempre o mesmo: 1 2 3 4 5 6 conn = get_db_connection() try: resultado = conn.execute(query) return resultado finally: conn.close() Funciona. Fecha a conexão mesmo se der exceção. Ninguém vai questionar em code review. O problema é que esse bloco vai se repetir em todo lugar que precisar de uma conexão — e quando a lógica de encerramento mudar (adicionar log, métricas, rollback), você vai caçar essa duplicação pelo projeto inteiro.
