JavaScriptを有効にしてください

Pythonの列挙型Enumを検証

 ·   4 min read

※記事内に商品プロモーションを含むことがあります。

はじめに

Pythonの列挙型Enumについて、同値判定の方法、型ヒントやdocstringの書き方などを調査した結果を備忘録として残します。

検証環境は以下の通りです。

  • Windows 10 Home 22H2
  • Python 3.13.5

Enumの基本

Enumの定義

まず、色を定義するMyColorを列挙型として定義します。
RED, GREENなどはメンバと呼ばれます。

1
2
3
4
5
6
from enum import Enum

class MyColor(Enum):
    RED = "Red"
    GREEN = "Green"
    BLUE = "Blue"

上記の例はメンバの値を文字列としましたが、以下のように整数にする場合もあります。

1
2
3
4
class MyColorInt(Enum):
    RED = 0
    GREEN = 1
    BLUE = 2

print

MyColorMyColor.REDprint文で表示します。

1
2
3
4
5
>>> print(MyColor)
<enum 'MyColor'>

>>> print(MyColor.RED)
MyColor.RED

for文(イテレータ)

列挙型はイテレータとしてfor文で使用することができます。
for文で取り出される要素は、列挙型のメンバになります。

1
2
3
4
5
>>> for color in MyColor:
...     print(color)
MyColor.RED
MyColor.GREEN
MyColor.BLUE

メンバの同値判定

列挙型のメンバが同値かどうかの判定は、is==とどちらでも可能です。

1
2
3
4
5
6
7
8
9
>>> red = MyColor.RED
>>> red is MyColor.RED
True
>>> red == MyColor.RED
True
>>> red is MyColor.GREEN
False
>>> red == MyColor.GREEN
False

また、列挙型のメンバは、その列挙型のインスタンスと見なされます。
isinstance()関数は、あるオブジェクトがそのクラスのインスタンスである場合にTrueを返します。

1
2
>>> isinstance(MyColor.RED, MyColor)
True

メンバの属性

メンバは属性を持ちます。
name属性でメンバの名前を、value属性でメンバの値を取得できます。

1
2
3
4
5
>>> red = MyColor.RED
>>> red.name
'RED'
>>> red.value
'Red'

型 (type)

型を確認します。MyColorEnumTypeクラスになります。

1
2
3
4
5
>>> type(MyColor)
enum.EnumType

>>> type(MyColor.RED)
<enum 'MyColor'>

メンバの値を省略する

Enumのメンバの名前のみ重要で、値は必要ではない場合もあります。
そのような場合、enum.auto()を使って番号を連番で与えることができます。
番号は1始まりで、1ずつ増加します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from enum import Enum, auto

class MyColorAuto(Enum):
    RED = auto()
    GREEN = auto()
    BLUE = auto()

print(f"{MyColorAuto.RED.value=}")
print(f"{MyColorAuto.GREEN.value=}")
print(f"{MyColorAuto.BLUE.value=}")

実行結果は以下になります。

1
2
3
MyColorAuto.RED.value=1
MyColorAuto.GREEN.value=2
MyColorAuto.BLUE.value=3

docstring

列挙型のdocstringは公式にサポートされていないようです。
ただし、以下のように書くとVisual Studio Codeでdocstringの内容を表示できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
class MyColor(Enum):
    """3 Colors."""

    RED = "Red"
    """1st color."""

    GREEN = "Green"
    """2nd color."""

    BLUE = "Blue"
    """3rd color."""

型ヒント

列挙型の型ヒントの例を示します。
ある関数my_func()が列挙型MyColorのメンバを引数に取る場合、以下のように型ヒントを書きます。

1
2
3
4
def my_func(color: MyColor) -> None:
    ...

my_func(MyColor.RED)

列挙型の派生

列挙型Enumの派生として、Pythonのenumライブラリには以下のクラスが実装されています。

  • IntEnum: int型と比較可能
  • StrEnum: str型と比較可能
  • Flag: メンバー同士のビット演算(論理和や論理積、XOR, 否定など)が可能
  • IntFlag: int型と比較可能なFlagクラス

ここでは、IntEnumStrEnumについて使い方を確認します。

IntEnum

int型と比較可能なIntEnumの挙動を確認します。

1
2
3
4
5
6
from enum import IntEnum

class MyColorI(IntEnum):
    RED = 0
    GREEN = 1
    BLUE = 2

このように定義したMyColorIのメンバは、整数との比較や演算が可能です。
また、メンバをint()関数でキャストすると、整数の値を取得できます。

1
2
3
4
5
6
7
8
>>> MyColorI.RED == 0
True
>>> MyColorI.RED > 2
False
>>> MyColorI.RED + 5
5
>>> int(MyColorI.RED)
0

StrEnum

str型と比較可能なStrEnumの挙動を確認します。

1
2
3
4
5
6
from enum import StrEnum

class MyColorS(StrEnum):
    RED = "Red"
    GREEN = "Green"
    BLUE = "Blue"

このように定義したMyColorSのメンバは、通常の文字列と同様に比較や演算が可能です。
また、メンバをstr()関数でキャストすると、文字列の値を取得できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
>>> MyColorS.RED == "Red"
True
>>> MyColorS.RED + "Flower"
'RedFlower'
>>> MyColorS.RED * 2
'RedRed'
>>> len(MyColorS.RED)
3
>>> str(MyColorS.RED)
'Red'

なお、StrEnumのメンバをenum.auto()で定義すると、値は変数名の小文字になります。

1
2
3
4
5
6
7
8
class MyColorSAuto(StrEnum):
    RED = auto()
    GREEN = auto()
    BLUE = auto()

print(MyColorSAuto.RED) # red
print(MyColorSAuto.GREEN) # green
print(MyColorSAuto.BLUE) # blue

参考

シェアする

Helve
WRITTEN BY
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

サイト内検索