Tema: python
-
Python 3.10 após o fim de vida: localizar interpretadores e recriar ambientes
A tabela de ciclo de vida do projeto Python registra 1 de outubro de 2026 como o fim de vida do Python 3.10. Inventarie os interpretadores realmente usados por serviços, ambientes virtuais e imagens, depois recrie e teste cada aplicação em uma linha de versões com suporte.
-
Como projetar uma ferramenta de linha de comando em Python: argparse, main() e códigos de saída
Coloque a interface em uma função main(argv) -> int registrada como console script, valide com type e choices do argparse, siga a convenção de códigos de saída (0 sucesso, 2 erro de uso, 1 demais falhas, códigos sysexits só se documentados), mantenha resultados em stdout e diagnósticos em stderr, e trate SIGINT e broken pipes.
-
Bootstrap para intervalos de confiança de uma mediana, percentil ou razão
Reamostre as observações brutas com reposição muitas vezes, calcule a estatística em cada reamostra e extraia o intervalo da distribuição resultante. Assim obtém-se uma incerteza para medianas, percentis, razões e diferenças em que não existe fórmula clássica. Indique o método, o número de reamostras e o tamanho da amostra, e não confie nele para percentis extremos de amostras pequenas.
-
Vincular a identidade de publicação no npm e no PyPI aos artefatos de lançamento aprovados
A publicação confiável via OIDC elimina tokens de publicação armazenados, mas sua segurança ainda depende do workflow autorizado. Separe build e publicação, proteja as aprovações e verifique a identidade do artefato, sem tratar a proveniência como um veredito sobre a presença de malware.
-
Testes baseados em propriedades com entradas geradas
Em vez de exemplos escolhidos à mão, um teste baseado em propriedades declara um invariante e deixa uma biblioteca gerar muitas entradas, reduzindo as falhas a contraexemplos mínimos; o Hypothesis é a implementação de referência para Python.
-
Gerenciadores de contexto em Python: como garantir a liberação de recursos
A instrução with executa __enter__ e __exit__ em torno de um bloco, de modo que arquivos, locks e conexões sejam liberados mesmo quando ocorre uma exceção; contextlib.contextmanager transforma um gerador em um gerenciador de contexto.
-
Docstrings úteis para ferramentas e leitores
A PEP 257 define onde os docstrings ficam e como são formatados; um estilo consistente (Google ou NumPy), com resumo de uma linha, descrição dos argumentos e do retorno e das exceções lançadas, torna-os úteis para leitores, editores e geradores de documentação.
-
Números de ponto flutuante: por que 0.1 + 0.2 não é 0.3
O ponto flutuante binário representa a maioria das frações decimais apenas de forma aproximada, e por isso a aritmética acumula erros de arredondamento. Compare com tolerância, some com cuidado, use inteiros ou tipos decimais para dinheiro e contagens e imprima com dígitos suficientes para que o valor possa ser convertido de volta sem perdas (round-trip).
-
Como carregar YAML com segurança
Os loaders completos de YAML podem instanciar objetos arbitrários a partir de nós com tags; use sempre um loader seguro, fixe a semântica da versão do YAML e valide o resultado com um schema antes de usá-lo.
-
Glob pattern dialects: what * and ** mean in .gitignore, .dockerignore, bash, Python and GitHub Actions
The same star and double-star characters mean different things depending on where the pattern is evaluated: a slash-less .gitignore pattern matches at every depth while the same line in .dockerignore only matches at the context root, bash's globstar recursion is opt-in, and Python's fnmatch is not even path-aware.
-
Quando o asyncio ajuda e quando não ajuda
O asyncio executa muitas tarefas limitadas por I/O em uma única thread, suspendendo nos pontos de await; não acelera código limitado por CPU, e chamadas bloqueantes dentro de corrotinas travam o loop inteiro.
-
Formatação e linting automatizados como contrato da equipe
Delegar o layout a um formatador e as verificações mecânicas a um linter tira as discussões de estilo do code review; EditorConfig, PEP 8 e ferramentas como o Ruff mostram como codificar esse contrato no repositório.
-
Classes Protocol: tipagem estrutural para o duck typing em Python
Um typing.Protocol declara os métodos e atributos de que um consumidor precisa; qualquer objeto que os tenha satisfaz o tipo sem herdar dele. Defina protocols junto ao código que depende deles, mantenha-os mínimos e use runtime_checkable apenas onde isinstance for realmente necessário.
-
Como encontrar um vazamento de memória com snapshots do tracemalloc
Inicie o rastreamento cedo com PYTHONTRACEMALLOC ou tracemalloc.start(nframe), tire um snapshot após o aquecimento e outro após N iterações, filtre o ruído de imports e leia compare_to(..., 'lineno') para achar linhas cujo tamanho cresce proporcionalmente a N; troque para o agrupamento 'traceback' para ver quem as chama.
-
Dinheiro e outras quantidades exatas: use Decimal, não float
O ponto flutuante binário não consegue representar com exatidão a maioria das frações decimais, e por isso somas de preços acumulam erros; o módulo decimal oferece aritmética decimal exata com arredondamento explícito, e inteiros em unidades menores são uma alternativa.
-
Como escolher entre threads, processos e asyncio para uma carga de trabalho em Python
Classifique primeiro o caminho crítico: espera por I/O combina com asyncio (muitas conexões, bibliotecas assíncronas) ou com um pool de threads (poucas chamadas bloqueantes); trabalho de CPU em Python puro exige processos ou um build free-threaded; código nativo que libera a GIL pode usar threads. Limite todos os pools, escolha explicitamente o método de início de processos e escreva o caminho de encerramento.
-
Dataclasses para registros simples
As dataclasses geram __init__, __repr__ e a comparação de igualdade a partir de campos anotados; dataclasses congeladas (frozen) dão objetos de valor imutáveis, slots reduz o uso de memória e field(default_factory=...) evita valores padrão mutáveis compartilhados.
-
A partir de que carga de trabalho o build free-threaded do CPython supera um pool de processos em um serviço com I/O e CPU misturados?
Pergunta em aberto: o build free-threaded elimina a GIL, mas acrescenta overhead em código single-thread e pode reativar a GIL ao importar uma extensão não preparada, enquanto pools de processos pagam por pickling e duplicação de memória. Para quais proporções entre CPU e espera, working sets e números de núcleos um pool de threads no build free-threaded entrega mais throughput por núcleo?
-
Tentar um exercício antes de ler a solução resolvida melhora a retenção de um recurso da linguagem após um mês, em comparação com ler a solução primeiro
Hipótese: para um engenheiro que aprende um recurso específico de uma linguagem, como a instrução match do Python, resolver um exercício antes de ver a solução resolvida leva a melhor retenção e transferência tardias do que estudar a solução primeiro e depois resolver um exercício semelhante. Propõe-se um teste intrapessoal com dois recursos, duas ordens e um teste tardio após um mês, sem afirmar nenhum resultado.
-
Cancelamento no asyncio: faça a limpeza sem engolir CancelledError
Mantenha o cancelamento observável pelo responsável pela tarefa e, ao mesmo tempo, libere os recursos no caminho interrompido.
Legível por máquina: JSON