Traffine I/O

日本語

2022-03-30

PythonのEnum

Enumとは

列挙型(enum)は、一連の名前付き値で構成される、独自のデータ型です。別の言い方をすると、列挙型は関連する定数をグループ化し、あらかじめ定義された値のいずれかを取る新しい型を作成する方法です。

例えば、タスクの異なる状態を追跡する必要があるシステムを開発しているとします。これらの状態は、「未着手」「進行中」「完了」「保留中」などのものが考えられます。ここでは、TaskStatusという名前の列挙型を作成し、これらの状態を列挙型のメンバーとして持つことができます。これにより、システム内でタスクの状態を整理された、整然とした、エラーに強い方法で扱うことができます。

PythonにおけるEnum

Pythonで列挙型(enum)を使用する方法について説明します。列挙型の定義方法、メンバーへのアクセス方法、列挙型の反復方法について説明します。

Enumモジュール

Pythonには、列挙型を作成するためのenumモジュールが用意されています。このモジュールは、任意の列挙型を派生させるために使用できる基本クラスEnumを定義しています。

python
from enum import Enum

列挙型の定義

Pythonで列挙型を定義するには、Enumを継承したクラスを作成し、各可能な値に対してクラス属性を追加します。

例えば、曜日のためのDayという列挙型を定義できます。

python
from enum import Enum

class Day(Enum):
    MONDAY = 1
    TUESDAY = 2
    WEDNESDAY = 3
    THURSDAY = 4
    FRIDAY = 5
    SATURDAY = 6
    SUNDAY = 7

この例では、Dayが列挙型であり、MONDAYTUESDAYWEDNESDAYなどがそのメンバーです。各メンバーは名前(例: MONDAY)と値(例: 1)を持ちます。

列挙型メンバーへのアクセス

Day列挙型を定義した後、ドット記法を使用してそのメンバーに直接アクセスできます。

python
print(Day.MONDAY)
print(Day.TUESDAY)
Day.MONDAY
Day.TUESDAY

また、列挙型のメンバーの値には、.valueプロパティを使用してアクセスすることもできます。

python
print(Day.MONDAY.value)

これにより、1という出力が得られます。

列挙型の反復処理

列挙型は反復可能です。forループを使用して列挙型を反復処理することができます。

python
for day in Day:
    print(day)
Day.MONDAY
Day.TUESDAY
Day.WEDNESDAY
Day.THURSDAY
Day.FRIDAY
Day.SATURDAY
Day.SUNDAY

列挙型の比較

列挙型のメンバーは、その識別子や値を使用して比較することができます。メンバーの識別子を使用して比較する場合(すなわち、isを使用する場合)、同じ列挙型の正確に同じメンバーであるかどうかを比較します。値を使用してメンバーを比較する場合(すなわち、==を使用する場合)、値が同じかどうかを比較します。

以下に例を示します。

python
print(Day.MONDAY is Day.MONDAY) # True
print(Day.MONDAY is Day.TUESDAY) # False
print(Day.MONDAY == Day.MONDAY) # True
print(Day.MONDAY == Day.TUESDAY) # False
print(Day.MONDAY == 1) # True

列挙型でのエイリアス

Pythonの列挙型では、同じ値を持つ2つのメンバーを持つことができます。この場合、2番目のメンバーは最初のメンバーのエイリアスと見なされます。

以下に例を示します。

python
from enum import Enum

class Color(Enum):
    RED = 1
    BLUE = 2
    GREEN = 3
    YELLOW = 4
    ORANGE = 1

この場合、ORANGEREDのエイリアスです。Color.ORANGEにアクセスしようとすると、Color.REDが返されます。

python
print(Color.ORANGE)  # Output: Color.RED

列挙型でのAuto()

列挙型のメンバーごとに関連付けられる実際の値に関心がない場合は、auto()関数を使用して値を自動的に割り当てることができます。

以下に例を示します。

python
from enum import Enum, auto

class Color(Enum):
    RED = auto()
    BLUE = auto()
    GREEN = auto()
    YELLOW = auto()

この場合、PythonはRED1BLUE2GREEN3YELLOW4という値を自動的に割り当てます。

一意な列挙型メンバーの確保

列挙型の全てのメンバーに一意の値を持たせたい場合は、enumモジュールの@uniqueデコレータを使用することができます。もし非一意の値を持つ列挙型にこのデコレータを適用した場合、PythonはValueErrorを発生させます。

python
from enum import Enum, unique

@unique
class Color(Enum):
    RED = 1
    BLUE = 2
    GREEN = 3
    YELLOW = 4
    ORANGE = 5

この場合、もしすでに使用されている値(例えば、PINK = 1)を持つ別の色を追加しようとすると、PythonはValueErrorを発生させます。

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!