※記事内に商品プロモーションを含むことがあります。
はじめに
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
MyColor
とMyColor.RED
をprint
文で表示します。
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)
型を確認します。MyColor
はEnumType
クラスになります。
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
クラス
ここでは、IntEnum
とStrEnum
について使い方を確認します。
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
|
参考