ūüźć Python Package Managers, Ecossistema, Pipenv e Poetry

Apr 24, 2020

14 minutos de leitura

Python é uma linguagem simples, é possível desenvolver funcionalidades com poucas linhas. Mas, a estrutura necessária para criação de um projeto completo não é algo tão trivial.

Tech Talks JS+

Recentemente tive a oportunidade de falar em uma Tech Talk na Juntos Somos Mais sobre gerenciadores de pacote Python, especialmente sobre Pipenv e Poetry.

Você pode assistir o vídeo completo aqui!

Hist√≥ria e Vers√Ķes

“Python √© uma linguagem de programa√ß√£o de alto n√≠vel, interpretada, de script, imperativa, orientada a objetos, funcional, de tipagem din√Ęmica e forte.1

Sua flexibilidade permite fazer muitas coisas. O Python pode ser usado para escrever programas simples e possui toda a pot√™ncia necess√°ria para criar solu√ß√Ķes enterprise complexas e de larga escala.

O uso tem se dado principalmente em:

  • Cria√ß√£o de aplicativos desktop, inclusive jogos;
  • Desenvolvimento de p√°ginas web e APIs;
  • An√°lise matem√°tica e ci√™ncia de dados;

√Č poss√≠vel encontrar grandes marcas que fazem uso massivo do Python em suas aplica√ß√Ķes, como Reddit, Dropbox e YouTube.

Há um conto que diz que sempre que o player do YouTube é ativado, um script Python é executado - mito ou verdade? não sei dizer!

Principais propriedades do Python:

  1. Case sensitive: Faz diferencia√ß√£o entre mai√ļsculas e min√ļsculas. Ex: Token √© diferente de token;
  2. Fortemente tipado: Aplica tipos de dados para previnir opera√ß√Ķes inconsistentes entre tipos;
  3. Din√Ęmico, implicitamente tipado: Voc√™ n√£o precisa declarar os tipos explicitamente para √†s suas vari√°veis (n√£o precisa, mas pode). Isso significa dizer, que a tipagem √© imposta em tempo de execu√ß√£o;
  4. Orientado a Objetos: Tudo no Python é considerado um objeto;

Zen of Python

√Č um conjunto composto por 19 princ√≠pios orientadores para escrita de programas que influenciam no design da linguagem. Esse conjunto foi escrito e proposto por Tim Peters em 1999.

Com o Python instalado, digite python no seu terminal. No REPL2 que ser√° aberto insira o comando import this e pressione ENTER.

Traduzido para pt-br

Bonito é melhor que feio.
Explícito é melhor que implícito.
Simples é melhor que complexo.
Complexo é melhor que complicado.
Flat é melhor que aninhado.
Esparso é melhor que denso.
Legibilidade conta.
Casos especiais n√£o s√£o especiais o suficiente para violar as regras.
Embora praticidade supere a pureza.
Os erros nunca devem passar silenciosamente.
A menos que seja explicitamente silenciado.
Diante da ambiguidade, recuse a tentação de adivinhar.
Deve haver uma - e preferencialmente apenas uma - maneira óbvia de fazê-lo.
Embora esse caminho possa não ser óbvio a princípio, a menos que você seja holandês.
Agora é melhor do que nunca.
Embora nunca seja melhor do que * agora * agora.
Se a implementação é difícil de explicar, é uma má ideia.
Se a implementação é fácil de explicar, pode ser uma boa ideia.
Os espaços para nome são uma ótima idéia - vamos fazer mais!

Apesar da crescente popularidade o Python não é uma linguagem nova, foi lançado publicamente na década de 90 por Guido van Rossum.

Uma visão encurtada da evolução da linguagem ao longo dos anos pode ser vista abaixo:

1991 - Python 0.9.0 (primeira vers√£o p√ļblica)
1994 - Python 1.0
2000 - Python 2.0
2008 - Python 3.0 e Python 2.6
2009 - Python 3.1
2010 - Python 2.7
2011 - Python 3.2
2012 - Python 3.3
2014 - Python 3.4 (pip como instalador de pacotes padr√£o do Python PEP 453)
2015 - Python 3.5
2018 - Python 3.7
2019 - Python 3.8
2020 - Python 3.8.2 (10/03), descontinuação do Python 2.7 e prévia do Python 3.9.0

Ecossistema Python

O ecossistema Python é composto por algumas entidades que no início podem ser um pouco confusas, mas vou tentar explicar o que fazem as principais.

Python Brasil

A comunidade Python Brasil re√ļne grupos de usu√°rios de todo o Brasil interessados em difundir e divulgar a linguagem de programa√ß√£o.

O objetivo √© reunir todo conte√ļdo produzido e traduzido pela comunidade brasileira, bem como informa√ß√Ķes relevantes para a linguagem.

Python Software Foundation (PSF)

The mission of the Python Software Foundation is to promote, protect, and advance the Python programming language, and to support and facilitate the growth of a diverse and international community of Python programmers.

‚ÄĒfrom the Mission Statement page3

A Python Software Foundation, ou PSF, é uma empresa sem fins lucrativos que detém os direitos de propriedade intelectual por trás da linguagem Python. A empresa gerencia o código-fonte aberto desde a versão 2.1 e as marcas envolvidas no ecossistema.

A PSF é a realizadora da PyCon, conferência norte-americana de Python, além disso a empresa apoia outros eventos de Python em todo o mundo.

Python.org

Site oficial do Python, nele é possível encontrar todos os links relativos ao ecossistema da linguagem, binários para download, informativos de releases e as PEPs4.

PyPA

Python Package Authority, é um subgrupo de pessoas dentro da PSF responsável por manter um conjunto principal de projetos usados no empacotamento do Python.

A PyPA publica o https://packaging.python.org/ como recurso autorizado sobre como empacotar, publicar e instalar projetos Python usando ferramentas atuais.

Contudo, n√£o define quais bibliotecas entrar√£o como padr√£o no Python e nem quais s√£o as ferramentas terceiras reconhecidas pela linguagem.

Principais ferramentas mantidas pela PyPA:

  • setuptools setup.py: Utilizado na constru√ß√£o e distribui√ß√£o de projetos Python;
  • wheel projeto-01.wheel: Formato de arquivo bin√°rio final;
  • pypi.org: Reposit√≥rio de pacotes Python;
  • virtualenv venv: Ferramenta para cria√ß√£o de ambientes isolados;
  • pip: A ferramenta mais popular para a instala√ß√£o de pacotes Python e est√° inclu√≠da nas vers√Ķes mais recentes do Python;
  • Pipfile: Alternativa centrada em aplicativos de n√≠vel superior ao arquivo de n√≠vel inferior do pip requirements.txt;
  • Pipenv: Projeto que visa trazer o melhor de todos os mundos de embalagens para o mundo Python, utiliza: Pipfile, pip e virtualenv;

PyPI

Repositório de pacotes Python, nele você poderá buscar, instalar e publicar pacotes.

Package Managers

As PEPs 517 e 518 definem o padrão para o arquivo pyproject.toml e estipulam uma seção chamada [build-system]. De forma simplificada, esse padrão serve para especificar:

  • PEP 517: Como um pacote dever√° ser criado a partir do c√≥digo fonte;
  • PEP 518: Quais pacotes precisam ser instalados antes de tentar construir, ou seja, os requisitos de constru√ß√£o;

Essas PEPs em conjunto definem um padr√£o simples para a gest√£o de depend√™ncias em aplica√ß√Ķes e pacotes a serem publicados na PyPI.

Pipenv

O Pipenv surgiu como uma boa proposta de solução para gerenciamento de pacotes Python, inteligente, feita pensando em humanos.

Com a promessa de controlar n√£o s√≥ as vers√Ķes de depend√™ncias como tamb√©m gerenciar os ambientes virtuais.

Mas as promessas n√£o se cumpriram… ūüėĘ

O tempo passou e a ferramenta ficou praticamente 1 ano e meio sem nenhuma atualiza√ß√£o, o que deixou a comunidade bastante insatisfeita, principalmente pela falta de um posicionamento consistente por parte do time desenvolvedor da “solu√ß√£o”.

No momento em que eu escrevo este artigo uma vers√£o foi publicada. No entanto, o Pipenv continua em desacordo com o padr√£o estipulado pelas PEPs 517 e 518.

Poetry

Com tudo isso, qual ferramenta usar?

Existem in√ļmeras alternativas, cada uma com suas particularidades. E neste artigo eu vou apresentar a minha op√ß√£o favorita, o Poetry.

O Poetry está de acordo com o padrão mencionado anteriormente, além disso a ferramenta tem recursos que facilitam a publicação de pacotes diretamente no PyPI.

O arquivo pyproject.toml de um projeto que utiliza o Poetry é semelhante ao mostrado abaixo.

[tool.poetry]
name = "blog-python"
version = "0.1.0"
description = "Blog with Python and Poetry"
authors = ["Marcos V. Leal <marcosleal.prd@gmail.com>"]
maintainers = ["Marcos V. Leal <marcosleal.prd@gmail.com>"]
license = "MIT"
readme = "README.md"
homepage = "https://github.com/marcosleal-prd/blog-python-poetry"
repository = "https://github.com/marcosleal-prd/blog-python-poetry"
keywords = ["Python", "Poetry", "Django", "Docker"]

[tool.poetry.dependencies]
python = "^3.7"
django = "^3.0.4"
psycopg2-binary = "^2.8.4"
django-filter = "^2.2.0"
drf-extensions = "^0.6.0"
python-json-logger = "^0.1.11"
request-id-django-log = "^0.1.1"
djangorestframework = "^3.11.0"
django-model-utils = "^4.0.0"
boto3 = "^1.12.39"
drf-link-navigation-pagination = "^0.0.4"

[tool.poetry.dev-dependencies]
pytest = "^5.2"
black = "^19.10b0"
isort = "^4.3.21"
pylint = "^2.4.4"
pylint-django = "^2.0.15"
pycodestyle = "^2.5.0"
flake8 = "^3.7.9"
mypy = "^0.770"
pytest-django = "^3.9.0"
pytest-env = "^0.6.2"
pytest-mock = "^3.0.0"

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"

Nesse arquivo você pode notar a presença dos elementos básico, dependências, dependências de desenvolvimento, [build-system] e alguns outros metadados.

Al√©m dessas chaves, voc√™ tamb√©m pode adicionar outras informa√ß√Ķes de configura√ß√£o, como por exemplo isort, black e tox.

Já deu para notar que essa é uma combinação poderosa, certo?

Conclus√£o

O Poetry é realmente muito simples, desde a sua instalação até o seu uso. Acredito que assim que visitar o site oficial chegará à mesma conclusão.

Meu conselho √© n√£o se prender a uma √Ļnica solu√ß√£o, experimente outras, entenda como funcionam. Esse tipo de ferramenta costuma ser bastante vol√°til.

Espero sinceramente que tenha gostado e que esse conte√ļdo o ajude a tornar o seu ambiente de desenvolvimento com Python ainda mais gostoso (ou pelo menos no que diz respeito a gest√£o de depend√™ncias).

N√£o esque√ßa de deixar suas d√ļvidas, cr√≠ticas ou sugest√Ķes de temas. ūüėČ

Um forte abraço e até a próxima.

Links:


  1. Defini√ß√£o criada pelo autor da linguagem Guido van Rossum na p√°gina do Wikip√©dia. ↩︎

  2. REPL (Read, Evaluate, Print and Loop) √© acr√īnimo para Leitura, Avalia√ß√£o, Impress√£o e Loop, porque √© exatamente isso que o computador faz. ↩︎

  3. Conceito retirado da p√°gina de declara√ß√£o de miss√£o da Python Software Foundation. ↩︎

  4. Proposta de aprimoramento de Python (PEP no site oficial). ↩︎