Atualização eficiente de dependências Python

Sobre Alexandre

  • Graduação em Engenharia da Computação pela UFSCar

  • Mestrado em Ciência da Computação pelo IME-USP

  • Pythonista desde 2007

  • Experiência profissional pelas indústrias de infraestrutura de internet, securitização e educação

  • Atualmente Senior Backend Developer em Moray

Python possui baterias incluídas

Seção Baterias incluídas do tutorial oficial de Python em português

Exemplo sem dependências externas: bottle

Documentação do micro-framework Python para Web chamado Bottle

import antigravity

Tirinha de xkcd que é carregada ao usar <code>import antigravity</code>

Versões de Python

Diagrama representando as versões de Python 2.7 e 3.0 até 3.14 com uma linha vertical representando o período da captura da imagem como meio de 2024

Meios de instalação de versão de Python

Exercício de versões de Python

Instalar versões 3.6 até 3.12 de Python usando pyenv | pyenv-win | asdf

  • Criar venv para cada versão

  • Ativar venv

  • Rodar python --version

Documentação módulo venv: https://docs.python.org/3/library/venv.html

Dependências para instalação de Python: https://github.com/pyenv/pyenv/wiki

Se eu vi mais longe, foi por estar sobre ombros de gigantes.
Letter from Sir Isaac Newton to Robert Hooke (1675)
— Isaac Newton

Reuso de código: pacotes

Imagem ilustrativa de um pacote literal

Guia de empacotamento Python

Página inicial do guia de usuário de empacotamento Python

Versionamento

Exemplos de numeração de versões

Página sobre versionamento utilizado no contexto de pacotes Python

Versionamento Semântico (SemVer)

Página sobre versionamento semântico - conhecido como SemVer - destacando a estrutura MAJOR.MINOR.PATCH

Controle de Versão do Calendário (CalVer)

Página sobre controle de versão de calendário - conhecido como CalVer - mencionando amplamente o uso de calendário sem exemplo real

Registro de mudanças (CHANGELOG)

  • Registro de resumo de mudanças

  • Facilita a procurar versões (in)compatíveis

  • Pode ser listagem de commits

Exemplo de CHANGELOG: pytest

Página com resumo das mudanças de <code>pytest</code>

PyPI

Página inicial do Python Package Index - também conhecido como Cheese Shop de Monty Python

Top 10 pacotes mais baixados até 1/Julho/2024

Lista com os top 10 pacotes mais baixados até julho de 2024: 1. boto3 2. urllib3 3. botocore 4. requests 5. certifi 6. typing-extensions 7. idna 8. charset-normalizer 9. python-dateutil 10. setuptools

Instalação de dependências e pip freeze

Exemplo: Flask em Python 3.12

$ # garantir versão Python como 3.12
$ # caso Windows, adaptar de acordo
$ python -m venv venv
$ source venv/bin/activate
$ pip install Flask
$ pip freeze
blinker==1.8.2
click==8.1.7
Flask==3.0.3
itsdangerous==2.2.0
Jinja2==3.1.4
MarkupSafe==2.1.5
Werkzeug==3.0.3

Ferramenta para visualizar: pipdeptree

$ # instale anteriormente graphviz em seu sistema
$ pip install pipdeptree graphviz
$ pipdeptree --graph-output png > dependencias.png

Diagrama com árvores de dependências

Exercício pipdeptree

  • Escolher alguns projetos

  • Criar venv para cada

  • Instalar dependências

  • Visualizar os respectivos grafos de dependências

Atualização de projeto Python

  • Vantagens

    • Evita ser alvo de vulnerabilidades conhecidas

    • Maior maleabilidade de mudanças

  • Requisitos

    • Tempo e cuidado

    • Necessário senso crítico de nuances

    • Processo investigativo iterativo

      • Código fonte é um de seus maiores aliados

Detalhes durante investigação

  • Prestar atenção em datas

    • Release: PyPI, repositório, etc

    • git blame

Documente o processo!

  • Tenha uma versão base segura antes de fazer qualquer modificação

  • Em cada iteração escolha o que quer atualizar: pacotes ou Python

  • Habilite warnings e não os ignore

  • Execute testes

  • Avalie se a mudança foi bem-sucedida

  • Enxague e repita ;)

Triagem de pacotes

Boa prática: segmentar na aplicação e seções correlatas

  • Aplicação / Biblioteca

  • Testes

  • Utilitários de desenvolvimento

  • etc…​

venv

Ambientes virtuais (virtual environment - venv) isolam pacotes

Não ter receio de recriar sempre que necessário

…​ porém, verificar potenciais diferenças antes de remover

Rede de segurança: testes

Antes de atualizar, verificar se existem testes automáticos

Caso não existam, procure identificar os fluxos mais importantes

Ferramentas para facilitar reprodutibilidade

Sequência para atualização

Diagrama com sentido horário e anti-horário entre os elementos Upgrade de versão Pacotes ou Python - Triagem / Ajuste - Teste

Ferramenta para auxiliar: pip-chill

Documentação da ferramenta <code>pip-chill</code> - lista somente pacotes que não são dependências de pacotes instalados

pip-chill

$ pip install pip-chill
$ pip-chill
flask==3.0.3
pip-chill==1.0.3

Considerações na triagem com pip-chill

  • Funciona bem para remover dependências intermediárias

  • Tomar muito cuidado para explicitamente incluir pacotes importantes

    • Exemplos:

      • pytest-cov oculta pytest

      • SQLAlchemy-Utils oculta SQLAlchemy

      • djangorestframework oculta Django

Exercício pip-chill

Atualização de pacotes / versão Python usando pip-chill

Perguntas:

  • Qual versão de Python a solução foi desenhada?

  • Como rodar os testes?

Ações:

  • Iterar processo pip-chill, triagem, teste e atualização

  • Anotar tentativas e sucessos

Recapitulação

Diagrama com sentido horário e anti-horário entre os elementos Upgrade de versão Pacotes ou Python - Triagem / Ajuste - Teste

Alexandre Harano

/ @ayharano

email@ayharano.dev