Organizar módulos e pacotes de forma eficaz é fundamental para a saúde de um projeto Python, especialmente à medida que ele cresce em complexidade. Seguir as convenções e boas práticas torna seu código mais fácil de entender, manter e colaborar.
models.py
deve conter apenas definições de modelos de dados.views.py
(em frameworks web) deve lidar com a lógica de apresentação e requisições/respostas.utils
deve conter funções utilitárias genéricas que podem ser usadas em várias partes do projeto.Exemplo:
meu_projeto/
├── autenticacao/
│ ├── __init__.py
│ ├── auth_service.py # Lógica de autenticação
│ └── models.py # Modelos de usuário/sessão
├── produtos/
│ ├── __init__.py
│ ├── views.py # Lógica de produtos
│ └── repositories.py # Interação com banco de dados de produtos
└── main.py
_
).
meu_modulo.py
, processar_dados.py
MeuModulo.py
, processardados.py
utils
, core
, api_v1
MyPackage
, apiV1
from modulo import *
(Wildcard Imports): Já discutimos isso, mas vale reforçar. Polui o namespace e dificulta a depuração e a compreensão da origem dos nomes. Use apenas em casos muito específicos e controlados (como em __init__.py
com __all__
).import
devem estar no início do arquivo, logo após a documentação do módulo (docstring) e antes de qualquer código.os
, sys
, math
).django
, requests
, pandas
).from meu_projeto.autenticacao import auth_service
from . import models
(dentro de autenticacao/views.py
para importar autenticacao/models.py
).__init__.py
__init__.py
(mesmo que vazios) em seus diretórios para indicar que são pacotes. Isso melhora a clareza e compatibilidade.__all__
: Se você decidir usar código dentro de __init__.py
para inicialização ou para expor sub-módulos/itens, use a variável __all__
para definir explicitamente o que deve ser importado via from pacote import *
.__init__.py
para descrever seu propósito e uso.