Boas práticas e o Zen do Python
LidoNesta aula, você aprenderá as boas práticas essenciais do Python, incluindo a PEP 8, os princípios do Zen do Python, a escrita de código idiomático (pythonic) e a importância do code review. Vamos explorar cada tópico com exemplos práticos e dicas para elevar a qualidade do seu código.
Bem-vindo à aula de número 98 do nosso curso de Python! Nesta aula, vamos mergulhar nas boas práticas que diferenciam um código meramente funcional de um código profissional, elegante e sustentável. Você já sabe escrever programas em Python, mas agora é hora de polir suas habilidades para produzir código que seja não apenas correto, mas também legível, idiomático e alinhado com a comunidade Python.
Vamos explorar quatro pilares fundamentais: a PEP 8 (o guia de estilo oficial), o Zen do Python (os princípios filosóficos que orientam o design da linguagem), o conceito de código idiomático (pythonic) e a prática de code review. Ao final, você terá um conjunto de ferramentas mentais para escrever código que outros desenvolvedores (e você mesmo no futuro) agradecerão.
PEP 8
A PEP 8 (Python Enhancement Proposal 8) é o guia de estilo oficial para código Python. Ela define convenções sobre como formatar o código, nomear identificadores, organizar importações, entre outros aspectos. Seguir a PEP 8 é essencial para garantir consistência em projetos, facilitar a leitura e a colaboração. Muitos projetos open source e empresas exigem conformidade com a PEP 8.
Principais recomendações da PEP 8:
- Indentação: use 4 espaços por nível, não tabs.
- Limite de linha: mantenha linhas com no máximo 79 caracteres (99 para docstrings/comentários).
- Espaçamento: use espaços ao redor de operadores, após vírgulas, e em atribuições.
- Nomes: use
snake_casepara funções e variáveis,CamelCasepara classes, eUPPER_CASEpara constantes. - Importações: coloque cada import em uma linha separada, organize em ordem padrão (stdlib, terceiros, locais) e evite importações curinga (
from module import *). - Linhas em branco: use duas linhas em branco entre funções e classes, e uma linha em branco entre métodos.
Exemplo de código seguindo a PEP 8:
import os
import sys
from django.conf import settings
MAX_CONNECTIONS = 100
class DatabaseConnection:
"""Gerencia conexões com o banco de dados."""
def __init__(self, host, port):
self.host = host
self.port = port
self.connected = False
def connect(self):
if not self.connected:
self.connected = True
print(f"Conectando a {self.host}:{self.port}")
def main():
conn = DatabaseConnection("localhost", 5432)
conn.connect()
if __name__ == "__main__":
main()
Ferramentas como flake8, pycodestyle e black podem ajudar a verificar e formatar automaticamente seu código conforme a PEP 8.
The Zen of Python
O Zen do Python é um conjunto de 19 princípios que capturam a filosofia de design da linguagem. Foi escrito por Tim Peters e pode ser acessado no interpretador Python com import this. Esses princípios servem como guia para escrever código que seja claro, simples e bonito.
Os princípios mais conhecidos incluem:
- Bonito é melhor que feio.
- Explícito é melhor que implícito.
- Simples é melhor que complexo.
- Complexo é melhor que complicado.
- Legibilidade conta.
- Erros nunca devem passar silenciosamente.
- Agora é melhor que nunca.
Vamos ver um exemplo prático: o princípio "Explícito é melhor que implícito" sugere que devemos evitar truques que tornem o código obscuro. Por exemplo, em vez de usar if len(lista) > 0:, prefira if lista:, pois é mais explícito sobre a intenção de verificar se a lista não está vazia.
# Não pythonico (implícito)
if len(nomes) > 0:
print("Há nomes")
# Pythonico (explícito)
if nomes:
print("Há nomes")
O Zen do Python não é um conjunto de regras rígidas, mas sim uma filosofia que nos orienta a tomar decisões de design que priorizam a clareza e a simplicidade.
Idiomático (pythonic)
Escrever código idiomático, ou "pythonic", significa usar os padrões e construções que são naturais à linguagem Python, aproveitando seus recursos para escrever código mais expressivo e eficiente. Código pythonic é geralmente mais legível e mais fácil de manter, pois segue as convenções da comunidade.
Alguns exemplos de código pythonic:
- Compreensão de listas em vez de loops tradicionais.
- Desempacotamento de tuplas para trocar valores ou extrair elementos.
- Uso de
enumerateem vez derange(len(...)). - Context managers (
with) para gerenciar recursos. - Uso de
zippara iterar sobre múltiplas sequências.
Exemplo de código não idiomático vs. idiomático:
# Não idiomático
cores = ['vermelho', 'verde', 'azul']
for i in range(len(cores)):
print(i, cores[i])
# Idiomático
for i, cor in enumerate(cores):
print(i, cor)
Outro exemplo: usar f-strings para formatação de strings, em vez de concatenação ou format():
nome = "Maria"
idade = 30
# Não idiomático
print("Nome: " + nome + ", idade: " + str(idade))
# Idiomático
print(f"Nome: {nome}, idade: {idade}")
Escrever código pythonic não é sobre usar os recursos mais avançados, mas sim sobre escolher a forma mais clara e expressiva de expressar uma operação.
Code review
Code review é o processo de revisão sistemática do código por outros desenvolvedores, com o objetivo de encontrar bugs, melhorar a qualidade e compartilhar conhecimento. É uma prática fundamental em equipes de desenvolvimento, especialmente em projetos open source e em ambientes ágeis.
Durante um code review, o revisor analisa o código em busca de problemas como:
- Erros lógicos e bugs.
- Violações de boas práticas (PEP 8, padrões da equipe).
- Falta de testes ou testes inadequados.
- Complexidade desnecessária.
- Problemas de segurança e desempenho.
Para fazer um code review eficaz, siga estas dicas:
- Revise o código, não a pessoa: foque no código e em como melhorá-lo, não em críticas pessoais.
- Seja específico: aponte linhas exatas e sugira soluções concretas.
- Equilibre elogios e críticas: reconheça o que está bom.
- Priorize problemas: separe o que é essencial do que é opcional.
- Use ferramentas: plataformas como GitHub, GitLab ou Bitbucket oferecem funcionalidades de review.
Exemplo de um comentário em um code review:
# Código original
result = []
for i in range(10):
if i % 2 == 0:
result.append(i)
return result
# Comentário do revisor:
# "Sugiro usar uma compreensão de lista para simplificar: [i for i in range(10) if i % 2 == 0]"
Adotar code review em seu fluxo de trabalho ajuda a manter a qualidade do código e a disseminar conhecimento entre os membros da equipe.
Boas práticas e observações finais
Além dos tópicos abordados, aqui vão algumas observações finais para consolidar seu aprendizado:
- Consistência é mais importante que a regra: se o projeto já tem um estilo, siga-o, mesmo que divirja da PEP 8 em alguns pontos.
- Documentação: escreva docstrings claras para módulos, classes e funções.
- Testes: escreva testes para seu código; isso é parte das boas práticas.
- Ferramentas: utilize linters (como
pylint) e formatadores (comoblack) para automatizar a conformidade. - Comunidade: participe de projetos open source para ver exemplos de código bem escrito e praticar code review.
Lembre-se: boas práticas não são um fim em si mesmas, mas um meio para criar software mais confiável e sustentável.
Exercícios
- Reescreva o trecho abaixo seguindo a PEP 8 (atenção à indentação, espaçamento e nomes):
def soma(a,b): return a+b class Calculadora: def __init__(self,valor): self.valor=valor def somar(self,outro): return self.valor+outro✓ Resposta:def soma(a, b): return a + b class Calculadora: def __init__(self, valor): self.valor = valor def somar(self, outro): return self.valor + outro - Cite três princípios do Zen do Python e explique como eles influenciam a escrita de código.
quadrados = []
for i in range(10):
quadrados.append(i ** 2)
quadrados = [i ** 2 for i in range(10)]
with open(...) as f: em vez de f = open(...). Explique por que essa é uma boa sugestão.with garante que o arquivo seja fechado automaticamente, mesmo em caso de exceção, evitando vazamento de recursos. É mais seguro e idiomático.processar_dados que receba uma lista de números e retorne uma lista apenas com os números pares, mas usando filter e lambda (pythonic).def processar_dados(numeros):
return list(filter(lambda x: x % 2 == 0, numeros))