ordered_enum is a small library for adding (total) orderings to
It provides two ordering behaviors:
ordered_enum.OrderedEnum: total ordering by definition
ordered_enum.ValueOrderedEnum: "total" ordering by member values
ordered_enum requires Python 3.7 or newer.
pip3 install ordered_enum
To use ordered_enum, just use
ValueOrderedEnum as your parent class:
from ordered_enum import OrderedEnum class State(OrderedEnum): Disabled = 4 Loaded = 3 Waiting = 2 Running = 1 Dead = 0 assert(State.Disabled < State.Loaded) assert(sorted([State.Dead, State.Waiting]) == [State.Waiting, State.Dead])
OrderedEnum doesn't require
@enum.unique (or unique values at all); it uses the order of
definition to impose an ordering between members.
If you'd like to impose an ordering based on member values, you can use
import enum from ordered_enum import ValueOrderedEnum @enum.unique class State(ValueOrderedEnum): Disabled = 4 Loaded = 3 Waiting = 2 Running = 1 Dead = 0 assert(State.Disabled > State.Loaded) assert(sorted([State.Waiting, State.Dead]) == [State.Dead, State.Waiting])
ValueOrderedEnum does require unique values, which can be enforced via
Failing to make a
ValueOrderedEnum's values unique will result in a silently broken ordering.
As mentioned above,
ordered_enum.OrderedEnum provides an ordering of enum values based on their order
of definition in the class. This means that:
- Enum values doesn't have to be unique for ordered_enum to work
- Enum values can be heterogeneously typed
- Moving enum values around changes their ordering
Therefore, you should either not depend on a specific ordering or ensure that your order of definition is the order you'd like.