Erros Comuns em Python que Você Deve Evitar e Como Corrigi-los

Erros Comuns em Python que Você Deve Evitar e Como Corrigi-los





Erros comuns em Python que você deve evitar


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.

Dica: prefira padrões imutáveis ou use None como sentinel e crie a estrutura dentro da função.
Por que acontece: ao definir a lista como padrão, o mesmo objeto é reutilizado 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.

Evite "except:". Use exceções específicas como FileNotFoundError, ValueError, etc.
Combine com recursos de contexto (with) para garantir liberação de recursos.

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

is: compara se são o mesmo objeto
==: compara pelo valor contido

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

Use with para abrir arquivos, conexões de banco ou sockets.
O código fica mais curto, legível e seguro.

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

© 2026 Yurideveloper. Conteúdo técnico, direto ao ponto, para quem busca qualidade e clareza no código.