Scripts Python Autocontidos: Como Rodar Qualquer `.py` com Dependências Embutidas no UV

Você já precisou compartilhar um script Python com colegas e teve que explicar: “Instala o Python 3.12, cria um venv, instala requests e rich, depois roda”? Com o gerenciador UV, isso acabou. Agora é possível escrever um único arquivo .py que já traz suas dependências dentro dele, como requests<3 e rich, e rodar tudo com apenas uv run script.py. Neste guia, você vai aprender como usar o bloco # /// script do UV para transformar scripts comuns em artefatos autocontidos, reprodutíveis e portáteis — perfeitos para automações, ferramentas internas e protótipos. ...

28 de novembro de 2025 · 4 min · 815 words · Riverfount

Descubra o UV: Gerenciador de Projetos Python para Iniciantes

O UV é um gerenciador de pacotes e projetos Python extremamente rápido, escrito em Rust, que substitui ferramentas como pip, venv e pipenv por comandos simples e automação de ambientes virtuais. Ele conecta gerenciamento de versões do Python, instalação de dependências e execução de scripts em um único comando, proporcionando agilidade no desenvolvimento.​ Instalação Rápida Para começar, instale o UV facilmente via terminal: Linux/macOS: curl -LsSf https://astral.sh/uv/install.sh | sh Windows PowerShell: irm https://astral.sh/uv/install.ps1 | iex Confirme a instalação com uv --version para garantir que está pronto para uso. ...

27 de novembro de 2025 · 2 min · 369 words · Riverfount

Por que abandonar números mágicos em status codes HTTP

Em desenvolvimento de APIs REST, status codes HTTP são tão importantes quanto o payload da resposta. Eles comunicam, de forma padronizada, o resultado de cada requisição e são consumidos por clientes, gateways, observabilidade e ferramentas de monitoração. Apesar disso, ainda é comum encontrar código repleto de “números mágicos”, como 200, 404 ou 500 espalhados pela base. Uma abordagem mais robusta é substituir esses valores literais por constantes descritivas, como HTTP_200_OK ou HTTP_404_NOT_FOUND. Essa prática aproxima o código das boas práticas de engenharia de software e melhora diretamente a legibilidade, a manutenção e a confiabilidade da API. ...

25 de novembro de 2025 · 5 min · 954 words · Riverfount

Usando Abstract Base Classes (ABC) em Projetos Reais de Python: Um Exemplo Prático com Microserviços

Este artigo mostra como aplicar Abstract Base Classes (ABC) em um projeto real robusto, focado no desenvolvimento de microserviços. O objetivo é garantir clareza, contratos explícitos e extensibilidade, aliando os conceitos a práticas modernas. Contexto do Projeto Imagine um sistema de microserviços para gerenciamento de pedidos, em que diferentes serviços precisam manipular objetos que representam entidades diversas, como Pedido e Cliente. Queremos garantir que todas as entidades sigam um contrato explícito para operações comuns (ex.: obter ID, validação). Além disso, há um repositório genérico para armazenar dados dessas entidades com verificação de tipo. ...

24 de novembro de 2025 · 3 min · 614 words · Riverfount

Protocols, Generics e Typing Avançado em Python: Técnicas para Construir Aplicações Robústas e Manuteníveis

Este artigo aborda como usar funcionalidades avançadas de tipagem em Python, como Protocols, Generics e técnicas avançadas de typing, para criar aplicações escaláveis, flexíveis e de fácil manutenção. Protocols: Contratos Flexíveis e Estruturais Protocols permitem definir contratos de métodos e propriedades sem herança explícita, facilitando a interoperabilidade entre microserviços. Qualquer classe que implemente os métodos definidos no protocolo pode ser usada onde esse protocolo é esperado. Exemplo prático: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from typing import Protocol class Serializer(Protocol): def serialize(self) -> bytes: pass class JsonSerializer: def serialize(self) -> bytes: return b'{"user": "alice"}' class XmlSerializer: def serialize(self) -> bytes: return b'<user>alice</user>' def send_data(serializer: Serializer) -> None: data = serializer.serialize() print(f"Enviando dados: {data}") send_data(JsonSerializer()) send_data(XmlSerializer()) Neste exemplo, send_data aceita qualquer objeto que implemente o método serialize, garantindo baixo acoplamento e flexibilidade. ...

21 de novembro de 2025 · 2 min · 407 words · Riverfount

Desvendando a Armadilha dos Argumentos Mutáveis como Default em Python

Você já enfrentou resultados inesperados ao usar listas ou dicionários como valores padrão em funções Python? Esse é um problema comum que pode causar bugs sutis e difíceis de encontrar. Neste artigo técnico, vamos desmistificar o motivo desse comportamento, mostrando exemplos práticos e como evitá-lo com boas práticas de programação. Se você é um desenvolvedor Python buscando produzir código mais robusto e previsível, este conteúdo é essencial para o seu dia a dia. ...

19 de novembro de 2025 · 3 min · 598 words · Riverfount

`from módulo import *` em Python: por que você nunca deveria usar essa prática

Entenda os riscos do uso de from módulo import * em Python, saiba por que ele compromete a legibilidade e a manutenção do código e descubra as alternativas recomendadas por desenvolvedores experientes. A armadilha da conveniência em Python Há algo em Python que seduz até os desenvolvedores mais experientes: a promessa de simplicidade. Poucas linguagens conseguem equilibrar legibilidade e poder expressivo como ele faz. Mas é justamente essa aparente simplicidade que, às vezes, nos leva a atalhos perigosos. Entre eles, um velho conhecido: from módulo import *. ...

18 de novembro de 2025 · 4 min · 737 words · Riverfount

Comparações com True em Python: erros comuns e práticas recomendadas para engenheiros

No desenvolvimento Python, especialmente em projetos de médio a grande porte e pipelines complexos de testes automatizados, é comum encontrar erros sutis relacionados a comparações com o valor booleano True. Uma prática aparentemente inofensiva, como usar == True para verificar condições, pode introduzir comportamentos inesperados que dificultam a manutenção, geram falsos positivos em testes e causam dúvidas em revisões de código. Essas situações não são incomuns em equipes que lidam com múltiplas camadas de abstração — desde o código de negócio até frameworks de teste — e evidenciam a importância de entender profundamente a diferença entre identidade e igualdade em Python, bem como as melhores práticas para escrever condicionais claras e robustas. ...

17 de novembro de 2025 · 4 min · 757 words · Riverfount

Como aplicar o Princípio da Inversão de Dependência em Python: um guia prático para sistemas flexíveis

Resumo: O Princípio da Inversão de Dependência (DIP), parte do conjunto SOLID, é fundamental para criar sistemas sustentáveis, extensíveis e fáceis de testar. Este artigo explora como aplicá-lo em Python usando typing.Protocol e injeção de dependência, com foco em arquiteturas limpas e aplicação prática em sistemas corporativos. Contexto Projetos orientados a objetos de longo prazo exigem mais do que modularidade: precisam de estabilidade arquitetural. O Princípio da Inversão de Dependência (Dependency Inversion Principle - DIP) aborda exatamente esse ponto. Ele recomenda que módulos de alto nível (os que contêm as regras de negócio) não conheçam os detalhes de baixo nível (implementações, drivers, frameworks), mas interajam por meio de abstrações. ...

14 de novembro de 2025 · 4 min · 752 words · Riverfount

Segregação de Interfaces em Python: projetando contratos enxutos com ABC e Protocol

O Princípio da Segregação de Interfaces (ISP — Interface Segregation Principle) é um dos pilares do SOLID e trata diretamente da qualidade dos contratos entre componentes. Em essência, ele afirma que uma classe não deve ser obrigada a depender de métodos que não utiliza. Essa regra incentiva o desenho de interfaces menores, mais coesas e representativas de um papel específico no sistema. Na prática, o ISP força uma reflexão arquitetural: qual é a verdadeira responsabilidade dessa abstração? Se a resposta envolve comportamentos heterogêneos, a interface provavelmente está concentrando demasiadas responsabilidades — um sinal de design frágil e baixo reuso. ...

12 de novembro de 2025 · 4 min · 690 words · Riverfount