Enum names a fixed set of members and separates those members from unchecked wire strings.
Python Enum: parse wire values into a closed state set
Operation contract
The dispatcher accepts only the two declared task states. Constructing a member from its wire value validates membership; it does not infer a new state from a spelling variation. The member name and its wire value serve different uses. Renaming a Python identifier need not change the serialized value.
Failure and ownership boundary
An enum is not a workflow engine. It cannot prove that a transition from queued to delivered is permitted for a particular job. Normal Enum members are not interchangeable with strings, while IntEnum and StrEnum have different comparison behavior. Keep those choices explicit. Python match statements: shape matching is not input validation and Python SQLite job project: reject conflicting replays by request identity show the next boundary.
Working program
from enum import Enum, unique
@unique
class DispatchState(Enum):
QUEUED = "queued"
DELIVERED = "delivered"
state = DispatchState("queued")
print(state.name, state.value)
print(state == "queued")
try:
DispatchState("QUEUE")
except ValueError:
print("unknown wire state rejected")Output
QUEUED queued
False
unknown wire state rejectedCosts and limits
This small declared set has bounded parsing work. The enum stores its members once at class construction. Domain checks, persistence and transition history cost more and remain application responsibilities.
Common Mistakes
- Membership does not prove a state transition is authorized.
- Changing wire values can break stored records even when member names stay similar.
Connected lessons
Python match statements: shape matching is not input validation, Python SQLite job project: reject conflicting replays by request identity, Python JSON validation: reject duplicate members and non-integer amounts.
Follow the ownership and update boundary
Python Enum aliases: iteration and member lookup have different domains.
