50 Regras de Python que Todo Especialista Deve Seguir
Uma lista de verificação mestre de hábitos que separam o Python de produção do código de tutorial. Agrupadas por domínio; cada regra é acionável e aplicável com ferramentas onde indicado.
Receita
Analise esta lista trimestralmente. Ative as regras do ruff/mypy que automatizam cada item "aplicável".
Quando usar isso:
- Integração de desenvolvedores Python seniores
- Revisões de arquitetura e bases para auditoria de código
- Configuração de políticas de lint e CI da equipe
Referência de Regras de Python
| # | Regra | Categoria |
|---|---|---|
| 1-10 | Estilo e legibilidade | Formatação |
| 11-20 | Tipos e contratos | Segurança |
| 21-30 | Estrutura e módulos | Design |
| 31-40 | Erros e testes | Confiabilidade |
| 41-50 | Segurança e operações | Produção |
Mergulho Profundo
Estilo e Legibilidade (1-10)
- Siga a PEP 8 - linhas de 88 caracteres com
ruff format; sem debates manuais de estilo. - Use nomes descritivos -
total_fatura, nãoxoutmp. - Prefira f-strings -
f"{nome}"em vez de"{}".format()e formatação%. - Ordem de importação: stdlib, terceiros, próprios - deixe o
ruff isortimpor. - Uma instrução por linha - sem cadeias de ponto e vírgula ou
if foo: bar()compostos. - Explícito é melhor que implícito - sem números mágicos; use constantes nomeadas.
- Plano é melhor que aninhado - retornos antecipados em vez de indentação de 5 níveis.
- Use
pathlib.Path- nãoos.path.joinpara código novo. - Use
enum.Enum- para conjuntos fixos de constantes, não literais de string. - Docstrings em APIs públicas - estilo Google ou NumPy; mínimo de uma linha.
Tipos e Contratos (11-20)
- Anote tipos de todas as funções públicas - parâmetros e tipos de retorno.
- Execute
mypyoupyrightem CI - tipos são contratos, não sugestões. - Use
X | None, nãoOptional[X]- sintaxe de união do Python 3.14. - Prefira
list[str]em vez deList[str]- genéricos embutidos (PEP 585). - Use
TypedDictou Pydantic - para dicionários estruturados, nãodictbrutos. - Estreite tipos com
isinstance- não verificaçõestype()nuas. - Use
Protocolpara duck typing - subtipagem estrutural em vez de ABCs quando apropriado. - Marque
anyintencional com comentários -# type: ignoreprecisa de um motivo. - Dataclasses para contêineres de dados -
frozen=Truequando imutável. - Pydantic 2 para limites de validação - entrada HTTP, configuração, dados externos.
Estrutura e Módulos (21-30)
- Layout
src/- pacote instalável e testável como os consumidores o veem. - Uma responsabilidade por módulo - arquivos com menos de 300 linhas; divida quando maiores.
- Sem importações circulares - reestruture ou use importações preguiçosas
TYPE_CHECKING. - Importações absolutas -
from myapp.services import billing, não cadeias de pontos relativas em bibliotecas. __all__explícito - para a superfície da API pública do pacote.- Sem lógica em
__init__.py- apenas reexportações; mantenha-o fino. - Injeção de dependência em vez de globais - passe dependências como parâmetros ou fixtures.
- Configuração via ambiente + pydantic-settings - não segredos ou caminhos codificados.
- Separe o domínio de I/O - funções puras testáveis sem mocks.
- Use
pyproject.toml- configuração única para dependências, ferramentas e build.
Erros e Testes (31-40)
- Exceções específicas -
raise ValueError("pct deve ser 0-100"), nãoraise Exceptionnu. - Nunca engula exceções -
except: passé quase sempre errado. - Use encadeamento de exceções -
raise NewError(...) from original. - Gerenciadores de contexto para recursos -
with open(...)e@contextmanager. - pytest para todos os testes - sem boilerplate
unittestpara código novo. - Um comportamento por teste - nomes descritivos:
test_discount_over_100_raises. - Mock nas fronteiras - HTTP, DB, sistema de arquivos; não lógica interna.
- Piso de cobertura de 80% - cobertura de ramificação em módulos críticos.
- Sem
printem bibliotecas - useloggingcom logger em nível de módulo. - Logging estruturado em produção - logs JSON com IDs de correlação.
Segurança e Operações (41-50)
- Nunca comite segredos - variáveis de ambiente, gerenciadores de segredos,
.envignorado pelo git. - Fixe dependências -
lockfilecommitado;uv sync --frozenem CI. - Valide toda entrada externa - Pydantic nas fronteiras da API.
- Use o módulo
secrets- nãorandompara tokens e senhas. - SQL parametrizado - nunca use f-string em consultas SQL.
- Mantenha o Python atualizado - patches de segurança em até 30 dias após o lançamento.
- Execute
pip-auditem CI - varredura semanal de vulnerabilidades de dependência. - Menor privilégio - permissões mínimas de IAM, DB e acesso a arquivos.
- Desligamento gracioso - manipule SIGTERM; descarregue logs e feche conexões.
- Meça antes de otimizar - perfil primeiro; legibilidade como padrão em vez de velocidade.
Armadilhas
- Tratar regras como dogma - o contexto importa; documente exceções em ADRs. Correção: regras guiam padrões, não absolutos.
- Ativar todas as regras do ruff no primeiro dia - fadiga de alertas. Correção: adote incrementalmente por grupo acima.
- Tipos sem testes - mypy verde, mas comportamento incorreto. Correção: combine tipos com cobertura pytest.
- 50 regras, zero automação - regras decaem sem CI. Correção: mapeie regras para gates do ruff/mypy/pre-commit.
- Aplicar regras de biblioteca a scripts - scripts únicos podem relaxar regras de estrutura. Correção: escopo das regras por tipo de pacote.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Documento de guia de estilo da equipe | Convenções personalizadas além da PEP 8 | Regras já cobertas aqui |
| Apenas códigos de regras do Ruff | Equipe focada em automação | Integração precisa de justificativa |
| Linter sem lista | Equipe pequena e experiente | Equipe em crescimento precisa de uma base compartilhada |
FAQs
Como faço para impor essas regras?
Mapeie para regras select do ruff, mypy strict, hooks pre-commit e verificações obrigatórias de CI.
Quais regras importam mais?
Tipos (11-20), testes (31-40) e segurança (41-50) previnem incidentes de produção.
Scripts seguem todas as 50?
Scripts relaxam 21-30 (estrutura), mas mantêm segurança (41-50) e estilo (1-10).
Com que frequência revisar?
Revisão trimestral da equipe. Atualize quando Python ou ferramentas lançarem versões principais.
Conflito entre regras?
Segurança e correção superam estilo. Documente trade-offs na descrição do PR.
Aplicação júnior vs sênior?
Júniors: foquem em 1-20 primeiro. Seniores: imponham 41-50 em revisão e arquitetura.
Como essas se relacionam com a PEP 8?
Regras 1-10 expandem a PEP 8 com ferramentas modernas (ruff, pathlib, f-strings).
São específicas para FastAPI?
Não. Python universal. Veja as 40 regras de API para orientação específica da web.
Posso gerar essa lista de verificação automaticamente?
Use como política de CI. ruff.toml e mypy.ini são a forma legível por máquina.
E o código async?
Veja 30 Regras Async para regras específicas de asyncio.
Relacionados
- PEP 8 e Referência de Estilo - detalhes de estilo
- 30 Regras de Segurança para Python - mergulho profundo em segurança
- Decisões de Arquitetura Python - escolhas estruturais
- Melhores Práticas de Linting e Formatação - aplicação de ferramentas
Versões de Stack: Esta página foi escrita para Python 3.14.0, FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.