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.

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_brl

O 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.