Descubra como criar enums em Python e evitar erros

Publicado em: 12/03/2026
Tempo de leitura: 9 minutos

Você já se viu em uma situação em que precisava representar um conjunto fixo de opções no seu código, como os dias da semana ou os estados de um pedido, e acabou usando strings ou números soltos? Embora pareça inofensivo no início, essa prática abre portas para erros de digitação e comportamentos inesperados. É aqui que entram as enumerações. Neste artigo, você vai descubra como criar enums em Python e evitar erros que podem comprometer a estabilidade do seu software, elevando o nível da sua lógica de programação com Python.

Um Enum (abreviação de enumeration) é uma estrutura de dados que permite dar nomes simbólicos a valores constantes. Em vez de verificar se uma variável é igual a “processando” ou “concluido”, você utiliza membros de uma classe específica. Isso torna o código mais legível para humanos e menos propenso a falhas de sintaxe humana. O Python introduziu o suporte oficial para enums na versão 3.4 através do módulo enum, mas o conceito é uma base sólida em muitas linguagens de programação modernas, conforme detalhado na documentação de ciência da computação da Wikipédia.

O que são Enums e por que são vitais?

Imagine que você está desenvolvendo um sistema de e-commerce. Um pedido pode ter vários status: Pendente, Pago, Enviado e Entregue. Se você usar strings comuns para representar esses estados, um simples erro de digitação como “pago” (com letra minúscula) em vez de “Pago” pode quebrar uma verificação lógica. Como os Enums são objetos imutáveis, eles garantem que você use apenas os valores permitidos pelo sistema.

O uso de enums ajuda a evitar o que chamamos de “números mágicos” ou “strings mágicas” espalhadas pelo código. Além disso, ao utilizar Enums, ferramentas de inspeção de código e IDEs podem oferecer o preenchimento automático (autocompletar), minimizando a chance de um erro de sintaxe Python ou falhas lógicas que seriam difíceis de rastrear em projetos maiores.

Como criar enums em Python pela primeira vez

Para começar a usar enumerações, o primeiro passo é importar a classe Enum do módulo padrão. Diferente de outras bibliotecas que exigem instalação externa, o módulo enum já vem integrado ao núcleo da linguagem. Veja o exemplo básico abaixo:

Python
from enum import Enum

class StatusPedido(Enum):
    PENDENTE = 1
    PAGO = 2
    ENVIADO = 3
    ENTREGUE = 4

Neste exemplo, definimos uma classe StatusPedido que herda de Enum. Cada atributo da classe é um membro do enum. É uma convenção comum usar letras maiúsculas para os membros, pois eles funcionam como constantes dentro do seu código. Ao contrário das variáveis em Python comuns, os valores dos enums não devem ser alterados durante a execução do programa.

Acessando membros e valores do Enum

Existem várias maneiras de interagir com um enum. Você pode acessar o membro diretamente pelo nome ou pelo valor atribuído a ele. Isso é extremamente útil quando você recebe dados de um banco de dados ou de uma API externa e precisa converter esses dados brutos em um objeto tipado.

Python
# Acesso via nome
print(StatusPedido.PAGO)  # Saída: StatusPedido.PAGO

# Acesso ao nome e ao valor
print(StatusPedido.PAGO.name)   # Saída: PAGO
print(StatusPedido.PAGO.value)  # Saída: 2

# Acesso pelo valor
print(StatusPedido(3))  # Saída: StatusPedido.ENVIADO

Essa flexibilidade permite que você mantenha a semântica no código enquanto lida com representações numéricas por baixo dos panos. Se você estiver lidando com tipos de dados Python variados, o enum garante que a conversão seja segura e previsível.

Como evitar erros de repetição com o decorador @unique

Um erro comum ao definir enums é atribuir acidentalmente o mesmo valor a dois nomes diferentes. Por padrão, o Python permite isso, tratando o segundo nome como um “apelido” (alias) para o primeiro. No entanto, na maioria dos casos de uso, cada membro deve ter um valor único para evitar ambiguidades.

Para forçar a unicidade, o Python oferece o decorador @unique. Se você tentar repetir um valor, o interpretador lançará uma exceção ValueError imediatamente, o que ajuda a descubra como criar enums em Python e evitar erros de lógica silenciosos.

Python
from enum import Enum, unique

@unique
class CodigoErro(Enum):
    SUCESSO = 0
    ERRO_FATAL = 1
    ERRO_CONEXAO = 1  # Isso causará um erro ao executar

Usar esse decorador é uma excelente prática recomendada pela Python Software Foundation, garantindo que sua estrutura de dados seja robusta desde o nascimento.

Iterando sobre Enums de forma eficiente

Muitas vezes, você precisará listar todas as opções de um enum, por exemplo, para popular um menu suspenso em uma interface gráfica ou validar uma entrada de usuário. Como os enums são iteráveis, você pode integrá-los facilmente em loops em Python.

Python
for status in StatusPedido:
    print(f"Opção disponível: {status.name} com valor {status.value}")

Essa funcionalidade economiza tempo e evita que você precise manter uma lista separada de strings que poderia ficar desatualizada se você adicionasse um novo status ao projeto futuramente. A manutenção torna-se centralizada na própria classe Enum.

Utilizando Enums com IntEnum e StrEnum

Existem variações especializadas de enums para casos específicos. Se o seu enum precisa se comportar exatamente como um número (permitindo comparações matemáticas, por exemplo), você deve usar IntEnum. Recentemente, nas versões mais novas, o StrEnum também se tornou popular para casos onde o valor é uma string.

A vantagem do IntEnum é que ele é compatível com operações de inteiros, o que é útil em cálculos de lógica de baixo nível ou integração com sistemas que esperam inteiros em Python puramente.

Python
from enum import IntEnum

class Prioridade(IntEnum):
    BAIXA = 1
    MEDIA = 2
    ALTA = 3

if Prioridade.ALTA > Prioridade.BAIXA:
    print("A prioridade alta tem valor numérico maior.")

Tratamento de exceções e validação com Enums

Ao receber dados de fontes externas, como um input Python do usuário, é provável que você receba valores que não existem no seu Enum. Tentar converter um valor inválido para um enum resultará em um erro. Por isso, é vital cercar essa operação com blocos de tratamento de erro.

Python
try:
    entrada = int(input("Digite o código do status: "))
    status_selecionado = StatusPedido(entrada)
    print(f"Você selecionou: {status_selecionado.name}")
except ValueError:
    print("Código inválido! Por favor, escolha um valor entre 1 e 4.")

Essa abordagem preventiva evita que seu programa feche abruptamente e melhora a experiência do usuário final, permitindo que você lide com entradas inesperadas de forma graciosa.

Vantagens de performance e organização

Embora o uso de enums possa parecer um overhead desnecessário para scripts pequenos, em aplicações de larga escala, a organização que eles proporcionam é imbatível. Eles ajudam a documentar o código por si só, deixando claro quais são as opções permitidas para cada parâmetro de função ou campo de banco de dados.

Comparado ao uso de dicionários ou múltiplas constantes globais, o Enum mantém os dados relacionados agrupados em um único namespace. Isso facilita a depuração (debug) e a realização de testes unitários no Python, pois você pode testar comportamentos baseados em estados fixos e previsíveis.

Descubra como criar enums em Python e evitar erros em projetos reais

Para consolidar o conhecimento sobre como descubra como criar enums em Python e evitar erros, vamos aplicar o conceito em uma função de processamento de pagamentos. Observe como o código fica limpo e legível.

Python
class TipoPagamento(Enum):
    CREDITO = "CARTAO_CREDITO"
    DEBITO = "CARTAO_DEBITO"
    PIX = "PIX"

def processar_transacao(valor, tipo: TipoPagamento):
    if not isinstance(tipo, TipoPagamento):
        raise TypeError("O tipo deve ser um membro de TipoPagamento")
    
    print(f"Processando R$ {valor:.2f} via {tipo.value}...")

# Uso correto
processar_transacao(100.50, TipoPagamento.PIX)

# Isso evita que alguém passe uma string qualquer
# processar_transacao(100.50, "DINHEIRO") -> Causaria erro controlado

Usar enums como dicas de tipo (type hints) aumenta drasticamente a segurança do seu código, permitindo que ferramentas como o MyPy identifiquem erros antes mesmo de você rodar o script.

Perguntas Frequentes

Posso herdar de um Enum já criado?

Não. O Python proíbe a herança de um enum que já possua membros definidos. Isso é feito para manter a integridade dos valores da enumeração. Você só pode herdar de uma classe que não tenha membros.

Como criar valores automáticos para os membros?

Você pode usar a função auto() do módulo enum. Isso é útil quando os valores numéricos exatos não importam, apenas a distinção entre os nomes.

É possível adicionar métodos dentro de um Enum?

Sim! Como enums são classes, você pode definir métodos dentro deles para adicionar comportamentos específicos a cada membro, tornando-os objetos muito poderosos.

Qual a diferença entre Enum e Dicionário?

Dicionários são coleções mutáveis de chave-valor. Enums são constantes, imutáveis e oferecem semântica de tipo, o que os torna ideais para representar estados fixos.

Posso usar Enums com JSON?

Para serializar um enum para JSON, você precisará acessar o seu atributo .value ou .name, já que o objeto Enum em si não é serializável por padrão pelo módulo json.

O que acontece se eu esquecer o valor e usar apenas o nome?

Se você não atribuir um valor (e não usar auto()), o Python retornará um erro de sintaxe, pois cada membro do enum precisa de um valor correspondente na definição da classe.

Consigo comparar um Enum com uma String?

Um membro de Enum comum não é igual a uma string, mesmo que o valor seja idêntico. Para essa comparação direta, você deve usar StrEnum (disponível no Python 3.11+) ou comparar explicitamente com membro.value.

Enums afetam a velocidade do código?

O impacto na performance é negligenciável para a maioria das aplicações. Os benefícios em segurança e manutenção superam amplamente qualquer custo mínimo de processamento ao instanciar a classe.

Dominar o uso de enums é um passo fundamental para qualquer desenvolvedor que deseja escrever código profissional e resiliente. Comece a substituir suas strings soltas por enums hoje mesmo e sinta a diferença na clareza do seu desenvolvimento.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    Resolução de Erros
    Foto do Leandro Hirt

    Como detectar vazamento de memória em Python

    O desenvolvimento de software moderno exige que programadores estejam atentos não apenas à lógica de negócio, mas também à eficiência

    Ler mais

    Tempo de leitura: 10 minutos
    11/03/2026
    Resolução de Erros
    Foto do Leandro Hirt

    Como usar cProfile para identificar gargalos no Python

    Você já sentiu que seu código está rodando mais devagar do que deveria, mas não consegue apontar exatamente onde está

    Ler mais

    Tempo de leitura: 10 minutos
    05/03/2026
    Resolução de Erros
    Foto do Leandro Hirt

    MemoryError no Python: Como resolver em minutos

    Você está executando um script, processando um grande volume de dados ou carregando um dataset pesado e, de repente, o

    Ler mais

    Tempo de leitura: 10 minutos
    03/03/2026
    Resolução de Erros
    Foto do Leandro Hirt

    PermissionError no Python: Como resolver em 2 minutos

    Você está escrevendo seu código, tudo parece perfeito, mas ao tentar executar uma ação simples como abrir um arquivo ou

    Ler mais

    Tempo de leitura: 10 minutos
    01/03/2026
    Resolução de Erros
    Foto do Leandro Hirt

    Erro de Sintaxe no Python: Como identificar e corrigir rápido

    Encontrar um Erro de Sintaxe no Python (o famoso SyntaxError) é um rito de passagem para qualquer pessoa que decide

    Ler mais

    Tempo de leitura: 9 minutos
    22/02/2026
    Resolução de Erros
    Foto do Leandro Hirt

    ImportError no Python? Descubra como corrigir em 2 minutos

    Você acabou de escrever um código incrível, mas, ao tentar executá-lo, o terminal exibe uma mensagem frustrante em vermelho: ImportError.

    Ler mais

    Tempo de leitura: 8 minutos
    22/02/2026