Enums
Enumerações substituem strings e inteiros mágicos por constantes nomeadas e tipadas. Membros são singletons - estáveis em identidade e auto-documentados em APIs, configurações e instruções match.
Busque em todas as páginas da documentação
Enumerações substituem strings e inteiros mágicos por constantes nomeadas e tipadas. Membros são singletons - estáveis em identidade e auto-documentados em APIs, configurações e instruções match.
from enum import StrEnum, auto
class Status(StrEnum):
PENDING = "pending"
ACTIVE = "active"
CLOSED = "closed"
class Priority(StrEnum):
LOW = auto()
MEDIUM = auto()
HIGH = auto()Quando usar:
match exaustivaFlagfrom enum import Flag, StrEnum, auto
class Status(StrEnum):
PENDING = "pending"
ACTIVE = "active"
CLOSED = "closed"
class Role(StrEnum):
ADMIN = "admin"
DEV = "dev"
VIEWER = "viewer"
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
ADMIN_PERMS = Permission.READ | Permission.WRITE | Permission.EXECUTE
def authorize(role: Role, required: Role) -> bool:
hierarchy = {Role.VIEWER: 0, Role.DEV: 1, Role.ADMIN: 2}
return hierarchy[role] >= hierarchy[required]
def can_read(perms: Permission) -> bool:
return Permission.READ in perms
def describe_status(status: Status) -> str:
match status:
case Status.PENDING:
return "aguardando"
case Status.ACTIVE:
return "em execução"
case Status.CLOSED:
return "concluído"
if __name__ == "__main__":
print(authorize(Role.ADMIN, Role.DEV))
print(can_read(ADMIN_PERMS))
print(describe_status(Status.ACTIVE))O que isso demonstra:
StrEnum serializa para o valor string para logs JSONFlag combina com | e testa com inmatch em membros de enum para tratamento exaustivoauto() gera valores para enums não-stringStatus.ACTIVE is Status.ACTIVE sempre Verdadeiro.str e Enum - compara igual ao seu valor string.int - use com cautela quando precisar de comportamento de int.Enum('Color', ['RED', 'GREEN']) para enums dinâmicos.| Classe | Tipo de Membro |
|---|---|
Enum | Genérico |
StrEnum | str |
IntEnum | int |
Flag | bitmask int |
# Serialização JSON
status = Status.ACTIVE
payload = {"status": status} # StrEnum -> "active" em muitos codificadores
# obter por valor
Status("active") # retorna Status.ACTIVEStatus.ACTIVE == "active" Falso em Enum simples. Correção: StrEnum ou compare .value.@enum.unique.Enum com valores de tupla (nome, extra).| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Literal["a","b"] | Apenas dicas de tipo | Precisa de validação em tempo de execução |
| const strings de módulo | Scripts minúsculos | Estabilidade da API é importante |
Pydantic Literal | Validação HTTP | Enums de domínio interno |
| tabela de consulta de banco de dados | Valores dinâmicos definidos pelo usuário | Estados fixos do sistema |
Enum são objetos em tempo de execução com identidade. Literal é apenas para tipagem estática de strings fixas.
Frequentemente serializa como valor string - verifique com seu codificador JSON (stdlib json usa o valor para StrEnum).
list(Status) ou Status.__members__.values().
@unique na classe Enum levanta um erro se dois nomes mapeiam para o mesmo valor não intencionalmente.
| união, & interseção, ~ inverter dentro da definição de Flag.
Correspondência exaustiva - mypy/pyright alertam sobre casos ausentes com configurações estritas.
Subclasse de Enum não é recomendada, exceto em casos especiais - componha em vez disso.
Inteiros incrementando a partir de um - substitua se valores estáveis forem necessários entre versões.
TextChoices/IntegerChoices são wrappers de enum do Django - padrões semelhantes.
Armazene .value na coluna; reconstrua com Enum(value) ao ler.
Versões da Pilha: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026