Python enum
last modified March 15, 2024
In this article we show how to work with enumerations in Python. Enumeration is a data type introduced in Python 3.4.
An enumeration is a set of symbolic names bound to unique, constant values. Enumerations can be used to create simple custom data types which include things such as seasons, weeks, types of weapons in a game, planets, grades, or days. By convention, enumeration names begin with an uppercase letter and are singular.
The enum
module is used for creating enumerations in Python.
Enumerations are created with the class
keyword or with the
functional API.
There are specific derived enumerations enum.IntEnum
,
enum.IntFlag
, and enum.Flag
.
Simple example
The following is a simple example of a Python enumeration.
#!/usr/bin/python from enum import Enum class Season(Enum): SPRING = 1 SUMMER = 2 AUTUMN = 3 WINTER = 4 seas = Season.SPRING print(seas) if seas == Season.SPRING: print("Spring") print(list(Season))
In the example, we have a Season
enumeration which has
four distinct values: SPRING, SUMMER, AUTUMN, and WINTER. To access a member,
we specify the enumeration name followed by a dot and the member name.
class Season(Enum): SPRING = 1 SUMMER = 2 AUTUMN = 3 WINTER = 4
The Season
enumeration is created with the class
keyword. We inherit from the enum.Enum
base class. We explicity set
numbers to the enumeration values.
seas = Season.SPRING print(seas)
An enumeration value is assigned to a variable and it is printed to the console.
if seas == Season.SPRING: print("Spring")
The Season.SPRING
is used in an if expression.
print(list(Season))
With the list
built-in function, we get the list of all possible values
for the Season
enum.
$ python main.py Season.SPRING Spring [<Season.SPRING: 1>, <Season.SUMMER: 2>, <Season.AUTUMN: 3>, <Season.WINTER: 4>]
Simple example II
The next example presents some other basic functionality of a Python enum.
#!/usr/bin/python from enum import Enum class Season(Enum): SPRING = 1 SUMMER = 2 AUTUMN = 3 WINTER = 4 seas = Season.SPRING print(seas) print(isinstance(seas, Season)) print(type(seas)) print(repr(seas)) print(Season['SPRING']) print(Season(1))
Again, we deal with a Season
enumeration created with the class
.
print(seas)
Here we print a human readable string representation of a Season
member.
print(isinstance(seas, Season))
With the isinstance
method, we check if the variable has a value of
Season
type.
print(type(seas))
The type
function prints the type of the variable.
print(repr(seas))
The repr
function provides more information about the enum.
print(Season['SPRING']) print(Season(1))
Member of an enumeration can be accessed by item name and index.
$ python main.py Season.SPRING True <enum 'Season'> <Season.SPRING: 1> Season.SPRING Season.SPRING
Functional creation
Python enums can be created with functional API.
#!/usr/bin/python from enum import Enum Season = Enum('Season', 'SPRING SUMMER AUTUMN WINTER', start=1) seas = Season.SUMMER print(seas) if seas == Season.SUMMER: print("Summer")
There are several ways how we can specify the values with functional API. In later examples, we will use other functional ways.
Season = Enum('Season', 'SPRING SUMMER AUTUMN WINTER', start=1)
Here the values are specified in a string, separated by space.
The start
provides the initial value.
$ python main.py Season.SUMMER Summer
Enum iteration
We can iterate over Python enums.
#!/usr/bin/python from enum import Enum Season = Enum('Season', ['SPRING', 'SUMMER', 'AUTUMN', 'WINTER'], start=5) for season in Season: print(season) for season in Season: print(season.name, season.value)
In this example, we create a Season
enum where the values are
set in a list of strings.
for season in Season: print(season)
We iterate over enum members in a for loop.
for season in Season: print(season.name, season.value)
Here we print their names and values.
$ python main.py Season.SPRING Season.SUMMER Season.AUTUMN Season.WINTER SPRING 5 SUMMER 6 AUTUMN 7 WINTER 8
Automatic values
Python enum values can be automatically set with the auto
function.
#!/usr/bin/python from enum import Enum, auto class Season(Enum): SPRING = auto() SUMMER = auto() AUTUMN = auto() WINTER = auto() for season in Season: print(season.value)
We have a Season
enum where its members get a value
with auto
function.
$ python main.py 1 2 3 4
Unique member values
The member values of a Python enum can be enforced to be unique
with the @unique
decorator.
#!/usr/bin/python from enum import Enum, unique @unique class Season(Enum): SPRING = 1 SUMMER = 2 AUTUMN = 3 WINTER = 3 # WINTER = 4 for season in Season: print(season)
The example fails with the ValueError: duplicate values found in <enum 'Season'>: WINTER -> AUTUMN
error, because the AUTUMN and WINTER members have the same value. If we comment out the
@unique
decorator, the example prints three members; the WINTER is ignored.
The __members__ attribute
The special attribute __members__
is a read-only ordered
mapping of names to members.
#!/usr/bin/python from enum import Enum Season = Enum('Season', [('SPRING', 1), ('SUMMER', 2), ('AUTUMN', 3), ('WINTER', 4)]) for name, member in Season.__members__.items(): print(name, member)
In the example, we use the __members__
property.
The enumeration members are created with a list of tuples using
functional API.
$ python main.py SPRING Season.SPRING SUMMER Season.SUMMER AUTUMN Season.AUTUMN WINTER Season.WINTER
The enum.Flag
The enum.Flag
is a base class for creating enumerated
constants that can be combined using the bitwise operations without losing
their Flag membership.
#!/usr/bin/python from enum import Flag, auto class Perm(Flag): EXECUTE = auto() WRITE = auto() READ = auto() print(list(Perm)) print(Perm.READ | Perm.WRITE)
The example shows how the Flag
can be used
on permissions.
$ python main.py [<Perm.EXECUTE: 1>, <Perm.WRITE: 2>, <Perm.READ: 4>] Perm.READ|WRITE
Enum with a static method
The following example presents an enumeration with a custom static method.
#!/usr/bin/python from enum import Enum import random class Day(Enum): Monday = 0 Tuesday = 1 Wednesday = 2 Thursday = 3 Friday = 4 Saturday = 5 Sunday = 6 @staticmethod def random_day(): return random.choice(list(Day)) rdays = [Day.random_day() for _ in range(10)] for e in rdays: print(e)
The example creates a random list of days.
class Day(Enum): Monday = 0 Tuesday = 1 Wednesday = 2 Thursday = 3 Friday = 4 Saturday = 5 Sunday = 6 @staticmethod def random_day(): return random.choice(list(Day))
We define a Day
enumeration. The random_day
static
method returns a random choice from the keys of the enumeration.
rdays = [Day.random_day() for _ in range(10)]
With a list comprehension, we create a list of ten random days.
$ python main.py Day.Thursday Day.Wednesday Day.Monday Day.Sunday Day.Saturday Day.Sunday Day.Friday Day.Sunday Day.Monday Day.Monday
We have a coin with two enum values: HEADS
and TAILS
.
from enum import Enum import random class Coin(Enum): HEADS = 0 TAILS = 1 @staticmethod def toss(): return random.choice(list(Coin)) for _ in range(15): print(f'{Coin.toss()}', end=' ')
In the example, we toss a coin fifteen times.
@staticmethod def toss(): return random.choice(list(Coin))
The static toss
method returns one of the values randomly.
$ python main.py Coin.TAILS Coin.TAILS Coin.HEADS Coin.HEADS Coin.TAILS Coin.HEADS Coin.TAILS ...
Using pattern matching
The match/case
keywords can be used with enums to create concise
code.
#!/usr/bin/python from enum import Enum import random class Day(Enum): Monday = 0 Tuesday = 1 Wednesday = 2 Thursday = 3 Friday = 4 Saturday = 5 Sunday = 6 days = [Day.Monday, Day.Tuesday, Day.Wednesday, Day.Thursday, Day.Friday, Day.Saturday, Day.Sunday] res = random.sample(days, 4) for e in res: match e: case Day.Monday: print("monday") case Day.Tuesday: print("tuesday") case Day.Wednesday: print("wednesay") case Day.Thursday: print("thursday") case Day.Friday: print("friday") case Day.Saturday: print("saturday") case Day.Sunday: print("sunday")
In the example, we define a Day enumeration.
days = [Day.Monday, Day.Tuesday, Day.Wednesday, Day.Thursday, Day.Friday, Day.Saturday, Day.Sunday] res = random.sample(days, 4)
We randomly choose four days from a list.
for e in res: match e: case Day.Monday: print("monday") case Day.Tuesday: print("tuesday") case Day.Wednesday: print("wednesay") case Day.Thursday: print("thursday") case Day.Friday: print("friday") case Day.Saturday: print("saturday") case Day.Sunday: print("sunday")
We check the four chosen values and print their corresponding string representations. For each option, we have a specific case arm.
$ python main.py monday friday thursday sunday
Source
Python enum - language reference
In this article we have worked with Python enumerations.
Author
List all Python tutorials.