Sintaxe perfeita, domínio errado: modelando regras com Enum e dataclass
Perceu Bertoletti - 06/11/2026

Inspirado na palestra Sintaxe perfeita, domínio errado, do 11° encontro: um código pode estar impecável, passar no linter e mesmo assim não representar o problema real. Vamos ver como algumas ferramentas do Python ajudam a aproximar o código do domínio.

Strings mágicas

Veja este código de pedidos:

pedido = {"status": "pago", "valor": -50}

if pedido["status"] == "pgo":  # erro de digitação
    print("Enviar pedido")

Ele roda sem erro nenhum, mas o pedido nunca será enviado. E um valor negativo passou sem ninguém perceber.

Use Enum para valores fixos

from enum import Enum


class Status(Enum):
    AGUARDANDO = "aguardando"
    PAGO = "pago"
    ENVIADO = "enviado"


status = Status.PAGO
print(status == Status.PAGO)  # True

Agora um Status.PGO gera erro na hora, e o editor sugere as opções válidas.

Proteja as regras na dataclass

from dataclasses import dataclass


@dataclass
class Pedido:
    valor: float
    status: Status = Status.AGUARDANDO

    def __post_init__(self):
        if self.valor <= 0:
            raise ValueError("O valor do pedido deve ser positivo")

    def pagar(self):
        if self.status != Status.AGUARDANDO:
            raise ValueError("Só é possível pagar pedidos aguardando pagamento")
        self.status = Status.PAGO


pedido = Pedido(valor=120.0)
pedido.pagar()
print(pedido.status)  # Status.PAGO

Pedido(valor=-50)  # ValueError: O valor do pedido deve ser positivo

A regra "só se paga um pedido que está aguardando" agora vive dentro do Pedido, e não espalhada em if por todo o sistema.

Use os nomes do negócio

Se o pessoal da empresa fala em "pedido", "faturar" e "despachar", use esses nomes no código. Um processar_dados(d) não diz nada; um faturar(pedido) diz tudo.

Dica final

Antes de escrever código, converse com quem entende do negócio. A sintaxe o Python e o linter conferem para você; o domínio, só você.

Contribua com novos artigos no nosso repositório.