Python Enums
An enum is a class that holds a fixed set of named members. A member gives each choice a real type.
Bare text accepts a typo
A status here is a plain string.
status = "piad"
print(status == "paid")
print(status)Named constants with a type
Colour is an enum class. Each member has a name and a value.
from enum import Enum
class Colour(Enum):
RED = 1
GREEN = 2
BLUE = 3
print(Colour.RED)
print(Colour.RED.name, Colour.RED.value)
print(type(Colour.RED).__name__)auto fills the values
auto() numbers members in order. You do not pick each value by hand.
from enum import Enum, auto
class Status(Enum):
NEW = auto()
PAID = auto()
SHIPPED = auto()
for member in Status:
print(member.name, member.value)Members are not text
A member equals itself, not its name text. Lookup by name or value returns the same member.
from enum import Enum
class Colour(Enum):
RED = 1
GREEN = 2
chosen = Colour.RED
print(chosen == Colour.RED)
print(chosen == "RED")
print(Colour["RED"])
print(Colour(1))IntEnum acts like an int
IntEnum members compare and add like ints. Print shows the number on Python 3.12.
from enum import IntEnum
class Priority(IntEnum):
LOW = 1
MEDIUM = 2
HIGH = 3
print(Priority.LOW)
print(Priority.LOW == 1)
print(Priority.LOW + 1)Flag members combine
The | sign joins two Flag members. Iteration follows the order members were defined.
from enum import Flag, auto
class Perm(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
both = Perm.READ | Perm.WRITE
print(both)
print(Perm.READ in both)
print(Perm.EXECUTE in both)
print([perm.name for perm in both])Example
from enum import Enum, auto, Flag
class OrderStatus(Enum):
NEW = auto()
PAID = auto()
SHIPPED = auto()
DONE = auto()
class Perm(Flag):
READ = auto()
WRITE = auto()
ADMIN = auto()
def describe(status):
if status is OrderStatus.NEW:
return "waiting for payment"
if status is OrderStatus.PAID:
return "ready to pack"
if status is OrderStatus.SHIPPED:
return "on its way"
return "complete"
order = OrderStatus.PAID
print(order)
print(order.name, order.value)
print(describe(order))
print([status.name for status in OrderStatus])
perms = Perm.READ | Perm.WRITE
print(perms)
print(Perm.WRITE in perms)
print(Perm.ADMIN in perms)
print([perm.name for perm in perms])Key points
- Enum: a class that holds a fixed set of named members
- Member: one named choice inside an enum, such as Colour.RED
- Use auto() when the exact value does not matter
- Use IntEnum when members must also act like ints
- Flag: an enum whose members can combine into one value
- Use in to test whether a Flag value holds a member
- Bare text gives a choice no type.
In this example, OrderStatus is a plain Enum. auto() gives its members the values 1 to 4. The order holds the member PAID. Print shows OrderStatus.PAID on Python 3.12. The name is PAID and the value is 2. describe() compares the member with is. It returns the packing message for PAID. Listing the names shows all four choices in order. Perm is a Flag for permissions. Joining READ and WRITE makes one combined value. The combined value holds WRITE, but not ADMIN. Listing it gives READ then WRITE, in definition order.
Note
On Python 3.12, print shows Colour.RED for a plain Enum.
It shows 1 for an IntEnum member.
Try it Yourself
Edit the code, then press Run.
Running is simulated · Python Playground
Exercise
When should you choose IntEnum instead of a plain Enum?