dataclasses, enum & contextlib
dataclasses reduce boilerplate for data objects. enum gives named constants with type safety. contextlib simplifies context managers (contextmanager, suppress, ExitStack).
Search across all documentation pages
dataclasses reduce boilerplate for data objects. enum gives named constants with type safety. contextlib simplifies context managers (contextmanager, suppress, ExitStack).
from dataclasses import dataclass
from enum import StrEnum
from contextlib import contextmanager
class Status(StrEnum):
PENDING = "pending"
DONE = "done"
@dataclass(frozen=True)
class Job:
id: int
status: Status = Status.PENDINGWhen to reach for this:
from contextlib import contextmanager, suppress
from dataclasses import dataclass, field
from enum import StrEnum
class Role(StrEnum):
ADMIN = "admin"
USER = "user"
@dataclass
class Account:
email: str
role: Role = Role.USER
tags: list[str] = field(default_factory=list)
@contextmanager
def temp_role(account: Account, role: Role):
old = account.role
account.role = role
try:
yield account
finally:
account.role = old
ada = Account("ada@example.com")
with temp_role(ada, Role.ADMIN):
print("elevated", ada.role)
print("restored", ada.role)
with suppress(FileNotFoundError):
open("missing.cfg").read()What this demonstrates:
frozen=True for immutable value objectsfield(default_factory=list) avoids mutable default pitfallslots=True (3.10+) memory savingskw_only=True (3.10+) explicit construction__post_init__ validationStrEnum for JSON APIsIntEnum for numeric codes@unique decorator prevents alias duplicateswith ExitStack().| Alternative | Use When | Don't Use When |
|---|---|---|
| Pydantic BaseModel | Validation/coercion | Hot inner loop DTO |
| TypedDict | JSON-shaped dicts | Need methods |
| attrs | attrs ecosystem | Stdlib-only |
dataclass flexible defaults and mutability control.
Enum.auto() assigns values automatically for non-StrEnum.
Wraps close()-able objects lacking context manager.
Async counterpart in contextlib for async with blocks.
Hide sensitive fields from repr output.
Measurable on huge instance counts - profile before defaulting slots everywhere.
StrEnum .value is str - json.dumps handles in dict values.
Structural pattern matching works with enum members in 3.10+.
Assert state before/after with block raises.
TextChoices/IntegerChoices mirror enum pattern in Django 5.2.
Stack versions: This page was written for Python 3.14.0 (stable 3.14, maintenance 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+, and uv 0.6+.
Reviewed by Chris St. John·Last updated Jul 19, 2026