Enumeraciones
Las enumeraciones reemplazan cadenas y enteros "mágicos" con constantes con nombre y tipadas. Los miembros son singletons: estables en identidad y auto-documentados en APIs, configuraciones y sentencias match.
Busca en todas las páginas de la documentación
Las enumeraciones reemplazan cadenas y enteros "mágicos" con constantes con nombre y tipadas. Los miembros son singletons: estables en identidad y auto-documentados en APIs, configuraciones y sentencias match.
from enum import StrEnum, auto
class Status(StrEnum):
PENDING = "pending"
ACTIVE = "active"
CLOSED = "closed"
class Priority(StrEnum):
LOW = auto()
MEDIUM = auto()
HIGH = auto()Cuándo usar esto:
match exhaustivaFlagfrom 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 "esperando"
case Status.ACTIVE:
return "en ejecución"
case Status.CLOSED:
return "terminado"
if __name__ == "__main__":
print(authorize(Role.ADMIN, Role.DEV))
print(can_read(ADMIN_PERMS))
print(describe_status(Status.ACTIVE))Lo que esto demuestra:
StrEnum se serializa a su valor de cadena para logs JSONFlag se combina con | y se prueba con inmatch sobre miembros de enumeración para un manejo exhaustivoauto() genera valores para enumeraciones que no son de cadenaStatus.ACTIVE is Status.ACTIVE siempre es Verdadero.str y Enum - compara igual a su valor de cadena.int - úselo con precaución cuando necesite comportamiento de int.Enum('Color', ['RED', 'GREEN']) para enumeraciones dinámicas.| Clase | Tipo de miembro |
|---|---|
Enum | Genérico |
StrEnum | str |
IntEnum | int |
Flag | máscara de bits int |
# Serialización JSON
status = Status.ACTIVE
payload = {"status": status} # StrEnum -> "active" en muchos codificadores
# obtener por valor
Status("active") # devuelve Status.ACTIVEint pero puede confundir a los verificadores de tipos. Solución: Prefiera StrEnum o Enum simple.Status.ACTIVE == "active" es Falso en Enum simple. Solución: StrEnum o comparar .value.@enum.unique.Enum con valores de tupla (nombre, extra).| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Literal["a","b"] | Solo sugerencias de tipo | Necesita validación en tiempo de ejecución |
Cadenas de módulo const | Scripts pequeños | La estabilidad de la API importa |
Pydantic Literal | Validación HTTP | Enumeraciones de dominio interno |
| Tabla de búsqueda en base de datos | Valores dinámicos definidos por el usuario | Estados fijos del sistema |
Enum son objetos en tiempo de ejecución con identidad. Literal es solo para tipado estático de cadenas fijas.
A menudo se serializa como valor de cadena; verifique con su codificador JSON (la biblioteca json estándar usa el valor para StrEnum).
list(Status) o Status.__members__.values().
@unique en la clase Enum genera un error si dos nombres se mapean al mismo valor sin querer.
| unión, & intersección, ~ invertir dentro de la definición de Flag.
Coincidencia exhaustiva: mypy/pyright advierten sobre casos faltantes con configuraciones estrictas.
Se desaconseja la subclasificación de Enum excepto en casos especiales; componga en su lugar.
Enteros que se incrementan a partir de uno; anule si se necesitan valores estables entre versiones.
TextChoices/IntegerChoices son envoltorios de enumeración de Django; patrones similares.
Almacene .value en la columna; reconstruya con Enum(value) al leer.
Versiones de la Pila: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 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+ y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026