Tive a oportunidade de ler uma versão inicial de “Hypermodern Python Tooling” de Claudio Jolowicz, com lançamento previsto para abril de 2024. Li a versão de junho de 2023 e fiquei motivado a escrever uma resenha, pois não encontrei um livro sobre esse assunto anteriormente.
Os temas abordados no livro antes estavam disponíveis apenas em vídeos de conferências, artigos técnicos e tutoriais, dependendo de quem se sente mais confortável com qual tipo de conteúdo. Na minha opinião, outras fontes, se há alguma atenção dada a essas questões, é muito superficial. Geralmente acaba sendo várias variações da instalação do próprio interpretador Python .
Em junho de 2023, o livro de acesso antecipado tinha 7 seções:
A primeira seção descreve o ciclo de lançamento do versionamento do Python. Ele descreve diferentes métodos de instalação para diferentes sistemas operacionais: Windows, Linux , macOS, o uso de pyenv para instalar muitas versões de interpretadores Python, não apenas baseados em CPython, mas também PyPy, IronPython, Jython, Pyston e outros. É dado um exemplo de uso do pylauncher, também para sistemas Unix. Alternativamente, é fornecido um exemplo de instalação usando Anaconda.
A segunda seção discute como o ambiente Python é organizado: interpretador, scripts de ponto de entrada, módulos (incluindo a biblioteca padrão e módulos de terceiros) e bibliotecas compartilhadas (contendo código personalizado compilado a partir de linguagens de baixo nível, como C). É mencionado o uso de ambientes virtuais, que podem ser criados usando o módulo venv integrado introduzido no Python3, bem como as diferenças em habilitá-los para diferentes sistemas operacionais. O gerenciador de pacotes é introduzido, tanto o pip integrado quanto o pipx de terceiros. São fornecidas informações gerais sobre como pesquisar módulos.
A terceira seção apresenta o índice do pacote Python. Damos um exemplo de script simples e mostramos todo o fluxo de trabalho, desde a criação de um projeto até carregá-lo nos índices de teste e de pacotes reais. O arquivo pyproject.toml é usado para especificar metainformações ao construir um pacote de aplicativo. Uma hatch de gerenciador de projeto moderna e compatível com os padrões (https://hatch.pypa.io/latest/) é usada como back-end de construção. A ferramenta oficial de upload do PyPI: Twine é usada como ferramenta de upload de pacotes. As opções de pacotes estão listadas: sdists e rodas. É fornecida uma lista dos campos mais essenciais com meta informações no arquivo pyproject.toml para um projeto.
A quarta seção levanta provavelmente o problema mais ambíguo: o problema do gerenciamento de dependências em um projeto. Existem duas opções: requisitos.txt com possíveis variações e combinações e pyproject.toml. Surpreendentemente, não haverá aqui uma história sobre poesia, mas sua descrição não demorará muito na quinta seção. Foi bastante interessante saber da existência de uma ferramenta para geração do chamado locus de dependência utilizando a ferramenta pip-tools.
A quinta seção trata da conhecida poesia, que fornece uma ferramenta automatizada para tarefas rotineiras: gerenciamento de dependências, criação de um pacote e publicação no índice de pacotes, etc. As diferenças em relação ao pyproject são descritas. Descrevemos as diferenças em pyproject.toml em relação ao que foi descrito nos capítulos anteriores, quando nos familiarizamos com sua sintaxe. Existem alternativas à poesia no ecossistema Python, como hatch e maturin.
A seção seis descreve um breve kmb (curso para jovens lutadores) sobre testes com elementos de refatoração para desenvolvedores Python, mencionando dois frameworks de teste: unittest e pytest. Esses são os princípios básicos, mas outras fontes com descrições mais detalhadas do tópico também são fornecidas para você se aprofundar. A única coisa que não é mencionada é o nariz, mas na prática o pytest tem sido o líder de fato nos últimos anos. No caso de restrições de dependência, a escolha é óbvia: unittest. É fornecido um exemplo de mini-refatoração de código para criar uma base mais flexível para suporte de código futuro e simplificar os testes.
Na sétima seção , discutimos a questão da cobertura de teste usando o módulo de rastreamento padrão, bem como o módulo de cobertura de terceiros. Mas ainda é recomendado usar o módulo de terceiros, que pode ser executado em diferentes versões do interpretador Python, e então obter um relatório combinado sobre a cobertura do código seguindo a execução de cobertura de regras → combinação de cobertura → relatório de cobertura. Eventualmente, todos enfrentam um dilema em algum momento de um projeto: “Para testar, você precisa refatorar o código; mas refatorar sem testes é muito arriscado”.
Aqui, muito provavelmente, tudo dependerá do próprio projeto, do seu escopo, da qualidade do próprio código e da disponibilidade dos testes como tal. Parece-me que se deve seguir um caminho pragmático, e nem sempre se deve atingir uma referência 100%, muitas vezes não é obrigatório. Muito provavelmente, no momento da leitura disto, o capítulo sobre a automatização de toda a história usando a ferramenta Nox ainda não estava pronto.
Antes de resumir, vamos instalar o pipx e tentar usá-lo.
No site oficial, os desenvolvedores da ferramenta posicionam assim:
“Visão geral: o que é pipx?
pipx é uma ferramenta para ajudá-lo a instalar e executar aplicativos de usuário final escritos em Python. É aproximadamente semelhante ao brew do macOS, ao npx do JavaScript e ao apt do Linux.
Está intimamente relacionado ao pip. Na verdade, ele usa pip, mas está focado na instalação e gerenciamento de pacotes Python que podem ser executados na linha de comando diretamente como aplicativos.”
É uma ótima notícia se o pacote também vier com interface CLI , pois será possível executar o pacote desejado diretamente, com um único comando, sem pré-instalação. Olá à ferramenta npx do mundo NodeJS ;)
Depois de instalar o pipx localmente, vamos executar 5 pequenos projetos para ver como ele é rápido e fácil.
No console, execute o seguinte comando: $ pipx run google-speech -l en -o hello_world.mp3 "Hello, world!"
Neste caso, o arquivo hello_world.mp3 é criado no diretório onde o comando foi executado, podendo ser ouvido em um media player.
No console, execute o seguinte comando: $ pipx run chksum-cli ./hello_world.mp3 b754e299a96327caaddd44b453f66ed9439c5d64d0d6e55c7e32471115757e5e sha256
O resultado será exibido independentemente de as somas de verificação dos arquivos corresponderem ou não.
No console, execute o seguinte comando: $ pipx run httpy-cli mail.ru
Uma resposta HTTP com cabeçalhos e corpo da solicitação será gerada.
No console, execute o seguinte comando: $ pipx run timy-cli -с
Um relógio analógico será exibido, com a possibilidade de pará-lo usando a combinação de teclas CTRL + C.
No console, execute o seguinte comando: $ pipx run cli-chess
Um menu para seleção do tipo de jogo será iniciado:
Para visualizar opções adicionais, você pode adicionar a tecla --help aos comandos acima.
No geral, o livro é fácil de ler, mas um pouco confuso em alguns lugares. Talvez faltem alguns exemplos não triviais. O livro descreve um exemplo de script para recuperar um artigo aleatório da Wikipedia.
O que eu gostei:
Pessoalmente, descobri a ferramenta pipx (análoga ao npx no mundo Node.js), que é muito útil quando você precisa se familiarizar rapidamente com algo e dar uma olhada. Especialmente bom para projetos onde existe uma interface CLI para execução;
Foi interessante saber que existem alternativas à poesia (https://python-poetry.org/), como hatch (https://hatch.pypa.io/latest/) e maturin (https://www. maturin.rs/);
Exemplo de uso de backports para diferentes versões do interpretador Python; por exemplo, importlib_metadata é usado como backport para Python3.7, em oposição a importlib.metadata para Python3.8. Exemplo de código do livro:
try:
from importlib.metadata import metadata
except ImportError:
from importlib_metadata import metadata
O que acho que está faltando no livro:
Não é coberta a opção de usar um gerenciador de pacotes para instalar o Python na família de sistemas operacionais Windows, como o chocolatey (https://chocolatey.org/);
A maneira de construir Python a partir do código-fonte para distribuições Unix não é abordada;
Não há como executar o Python em um contêiner Docker. Existem muitas construções agora, começando pela mais minimalista baseada no alpino;
Não foi considerada uma forma de trazer o projeto para rodar o arquivo executável .exe no Windows (na minha prática houve um caso assim. Sim, concordo que é uma tarefa muito específica, mas ainda assim);
Nenhum exemplo de distribuição alternativa de projeto, por exemplo, usando o gerenciador de pacotes padrão apto para distribuições do tipo Debian com a ajuda de setuptools e dh-virtualenv com formação de pacote *.deb);
Nenhum capítulo descrevendo linters como pylint, flake8, isort, black, mypy, pyright, etc.
Mas esta é minha opinião subjetiva, você pode discordar.
Apesar de o livro ainda não estar em sua versão final (com lançamento previsto para abril de 2024), posso recomendá-lo a todos os interessados em Python.
Autor: Daniil Nikitin, desenvolvedor de software sênior da Usetech