Erros comuns em Python que você deve evitar
Guia direto ao ponto com exemplos práticos, dicas de prevenção e padrões simples para manter seu código robusto.
1. Uso de argumentos padrão mutáveis
Um dos armadilhos mais comuns para iniciantes e até para desenvolvedores experientes é definir valores padrão mutáveis em funções. Objetos como listas e dicionários são criados apenas uma vez durante a definição da função, o que pode levar a comportamentos inesperados entre chamadas.
# Exemplo ruim
def append_to(value, to=[]):
to.append(value)
return to
print(append_to(1)) # [1]
print(append_to(2)) # [1, 2] <-- surpresa!
# Forma correta
def append_to(value, to=None):
if to is None:
to = []
to.append(value)
return to
print(append_to(1)) # [1]
print(append_to(2)) # [2]
2. Tratamento inadequado de exceções
Capturar exceções de forma muito ampla pode esconder erros reais e dificultar o diagnóstico. Sempre prefira capturar exceções específicas e, quando pertinente, mantenha o contexto da operação que estava sendo realizada.
# Exemplo ruim
try:
with open('dados.txt') as f:
data = f.read()
except:
print("Erro ao ler o arquivo")
# Problema: captura qualquer exceção, escondendo bugs
# Prática recomendada
try:
with open('dados.txt') as f:
data = f.read()
except FileNotFoundError:
print("Arquivo não encontrado")
except PermissionError:
print("Permissão negada")
except OSError as e:
print(f"Erro de I/O: {e}")
3. Diferença entre is e == (identidade vs igualdade)
Com frequência, a comparação errada entre objetos pode levar a bugs sutis. is avalia identidade (mesmo objeto na memória), enquanto == avalia igualdade de valor. Em estruturas como listas, dicionários e strings, entender a diferença evita lógica incorreta.
# Exemplo ilustrativo
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # True, valores iguais
print(a is b) # False, objetos diferentes
print(a is c) # True, aponta para o mesmo objeto
# Evitando armadilhas
def comparar(val1, val2):
return val1 == val2 # use == para comparar conteúdos
# Cuidado com 'is' só para identidades de singletons
print(None is None) # True
print(0 is 0) # True em muitas implantações, mas não dependa disso para lógica
4. Gerenciamento de recursos: abertura de arquivos e contexto
Gerenciar recursos manualmente aumenta a probabilidade de vazamentos. O gerenciador de contexto (with) assegura que recursos sejam liberados corretamente, mesmo em casos de exceção.
# Sem context manager
f = open('log.txt', 'a')
try:
f.write('Nova entrada\\n')
finally:
f.close()
# Com context manager
with open('log.txt', 'a') as f:
f.write('Nova entrada\\n')
# Observação: contexto também se aplica a recursos externos
import socket
with socket.create_connection(('example.com', 80)) as s:
s.send(b'GET / HTTP/1.1\\r\\nHost: example.com\\r\\n\\r\\n')
response = s.recv(1024)
print(response)
Conclua com consistência
Ao adotar padrões simples e previsíveis, você reduz a dívida técnica e aumenta a qualidade do código. Reflita sobre cada erro comum apresentado aqui e analise seus projetos atuais para identificar onde aplicar as práticas discutidas.
Gostou do conteúdo?
Explore mais artigos técnicos para aprimorar suas habilidades em Python e desenvolvimento de software.
Sou Apaixonado pela programação e estou trilhando o caminho de ter cada diz mais conhecimento e trazer toda minha experiência vinda do Design para a programação resultando em layouts incríveis e idéias inovadoras! Conecte-se Comigo!