Módulo 15 - Empacotamento e boas práticas
pyproject.toml e imports bem resolvidos
9 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Entender o papel do pyproject.toml num projeto Python moderno.
- Reconhecer nome, versão e dependências como metadados do projeto.
- Diferenciar import absoluto de import relativo.
- Saber quando preferir cada estilo de import.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: pyproject.toml e imports bem resolvidos.
Os objetivos desta aula. Entender o papel do pyproject.toml num projeto Python moderno. Reconhecer nome, versão e dependências como metadados do projeto. Diferenciar import absoluto de import relativo. Saber quando preferir cada estilo de import.
Veja o essencial, parte por parte.
O pyproject.toml em visão geral. O pyproject.toml guarda nome, versão e dependências do projeto.
Imports absolutos contra relativos. Dentro de um pacote com vários módulos, um módulo frequentemente precisa usar outro.
Qual estilo de import preferir. Prefira imports absolutos: são explícitos e sobrevivem melhor à reorganização.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
O pyproject.toml em visão geral
Todo projeto Python sério precisa se apresentar: qual o nome, qual a versão, de que outras bibliotecas ele depende. Antigamente isso ficava espalhado por vários arquivos de configuração. Hoje, a comunidade convergiu para um único arquivo padronizado, o pyproject.toml. Ele é escrito num formato simples de ler, o TOML, organizado em seções. Você não precisa decorar a sintaxe agora; o importante é entender que esse arquivo é o documento de identidade do projeto, e que ferramentas modernas o leem para saber como construir, testar e verificar o seu código.
# pyproject.toml (visao simplificada)
[project]
name = "financas"
version = "0.1.0"
description = "Utilidades financeiras"
requires-python = ">=3.10"
dependencies = [
"requests>=2.31",
]
[tool.ruff]
line-length = 100
# Metadados do projeto e configuracao de ferramentas num arquivo so.O pyproject.toml reúne metadados na seção [project] e configura ferramentas em seções [tool.*].
Duas partes valem destacar. A seção project traz os metadados: nome, versão, descrição e a lista de dependências, ou seja, as bibliotecas externas que o projeto usa e que serão instaladas junto. As seções que começam com tool guardam a configuração de ferramentas específicas, como o formatador e o verificador de estilo, cada uma no seu espaço. Concentrar tudo num arquivo evita a proliferação de configurações soltas e deixa qualquer pessoa que abre o projeto ver, num lugar só, como ele se declara e com que ferramentas trabalha.
Imports absolutos contra relativos
Dentro de um pacote com vários módulos, um módulo frequentemente precisa usar outro. Há dois jeitos de importar. O import absoluto nomeia o caminho completo a partir da raiz do pacote: from financas.juros import juros_simples. Ele é explícito e funciona igual de qualquer lugar. O import relativo usa pontos para partir do pacote atual: from .juros import juros_simples, em que o ponto significa neste mesmo pacote. Dois pontos sobem um nível. Ambos funcionam, mas têm perfis diferentes de clareza e robustez.
# Dentro de financas/relatorios/mensal.py
# Import absoluto: caminho completo a partir da raiz do pacote
from financas.juros import juros_compostos
from financas.formatacao import formatar_brl
# Import relativo: parte do pacote atual com pontos
from ..juros import juros_compostos # .. sobe para financas
from ..formatacao import formatar_brlO mesmo import de dois jeitos: absoluto (caminho da raiz) e relativo (pontos a partir do pacote atual).
Import absoluto
- Nomeia o caminho completo da raiz
- Explícito e fácil de rastrear
- Não muda se o arquivo é movido dentro do pacote
- Recomendado pela PEP 8 como padrão
Import relativo
- Usa pontos a partir do pacote atual
- Mais curto em pacotes profundos
- Deixa claro que a dependência é interna
- Quebra com mais facilidade ao reorganizar
Qual estilo de import preferir
A recomendação da PEP 8, o guia de estilo oficial, é preferir imports absolutos, porque são mais legíveis e menos sujeitos a surpresas. Ao ler from financas.juros import juros_simples, você sabe exatamente de onde a função vem, sem precisar calcular caminhos relativos na cabeça. Os imports relativos são aceitáveis, especialmente dentro de um pacote grande, onde deixam claro que a dependência é interna e evitam repetir o nome longo do pacote. O que a PEP 8 desaconselha é o import relativo implícito, o estilo antigo sem pontos, que hoje nem funciona mais.
Há também uma boa prática de organização dos imports no topo do arquivo, que a PEP 8 recomenda e as ferramentas de estilo aplicam sozinhas: agrupar primeiro os imports da biblioteca padrão, depois os de bibliotecas de terceiros, e por último os do seu próprio projeto, cada grupo separado por uma linha em branco. Isso deixa visível, num relance, o que o módulo depende de fora e o que depende de dentro. É um detalhe pequeno que, somado, torna qualquer arquivo mais fácil de ler.
Teste rápido
Segundo a PEP 8, qual estilo de import é o preferido por padrão?
Perguntas frequentes
- Preciso escrever o pyproject.toml na mão?
- Não necessariamente. Muitas ferramentas de empacotamento geram um pyproject.toml inicial para você e depois você ajusta os metadados. O importante é entender o papel de cada seção: a de projeto, com nome, versão e dependências, e as de ferramentas, com a configuração de cada uma.
- O pyproject.toml substitui o antigo setup.py?
- Na prática moderna, sim, para a maioria dos projetos. O pyproject.toml padronizou num único arquivo o que antes se espalhava por setup.py, setup.cfg e outros. Projetos antigos ainda usam setup.py, mas para código novo o pyproject.toml é a recomendação da comunidade.
- O que significam os pontos em um import relativo?
- Um ponto significa o pacote atual, aquele em que o arquivo está. Dois pontos sobem um nível, para o pacote que contém o atual. Assim, from .juros importa do mesmo pacote, e from ..juros importa de um nível acima. É uma navegação relativa, parecida com pastas.
- Import relativo é sempre ruim?
- Não. Ele é legítimo e útil dentro de um pacote, onde deixa claro que a dependência é interna e evita repetir o nome longo do pacote. O que a PEP 8 desaconselha é o relativo implícito, sem pontos. Entre absoluto e relativo com ponto, é uma questão de preferência e contexto.
- O que são dependências no pyproject.toml?
- São as bibliotecas externas que o seu projeto precisa para funcionar, listadas na seção de projeto. Quando alguém instala o seu pacote, o instalador lê essa lista e traz junto as dependências. É como o projeto declara, de forma verificável, do que ele depende para rodar.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.