はじめに #
Pythonの列挙型Enumについて、同値判定の方法、型ヒントやdocstringの書き方などを調査した結果を備忘録として残します。
検証環境は以下の通りです。
- Windows 10 Home 22H2
- Python 3.13.5
Enumの基本 #
Enumの定義 #
まず、色を定義するMyColor
を列挙型として定義します。
RED
, GREEN
などはメンバと呼ばれます。
from enum import Enum
class MyColor(Enum):
RED = "Red"
GREEN = "Green"
BLUE = "Blue"
上記の例はメンバの値を文字列としましたが、以下のように整数にする場合もあります。
class MyColorInt(Enum):
RED = 0
GREEN = 1
BLUE = 2
print #
MyColor
とMyColor.RED
をprint
文で表示します。
>>> print(MyColor)
<enum 'MyColor'>
>>> print(MyColor.RED)
MyColor.RED
for文(イテレータ) #
列挙型はイテレータとしてfor
文で使用することができます。
for
文で取り出される要素は、列挙型のメンバになります。
>>> for color in MyColor:
... print(color)
MyColor.RED
MyColor.GREEN
MyColor.BLUE
メンバの同値判定 #
列挙型のメンバが同値かどうかの判定は、is
と==
とどちらでも可能です。
>>> red = MyColor.RED
>>> red is MyColor.RED
True
>>> red == MyColor.RED
True
>>> red is MyColor.GREEN
False
>>> red == MyColor.GREEN
False
また、列挙型のメンバは、その列挙型のインスタンスと見なされます。
isinstance()
関数は、あるオブジェクトがそのクラスのインスタンスである場合にTrue
を返します。
>>> isinstance(MyColor.RED, MyColor)
True
メンバの属性 #
メンバは属性を持ちます。
name
属性でメンバの名前を、value
属性でメンバの値を取得できます。
>>> red = MyColor.RED
>>> red.name
'RED'
>>> red.value
'Red'
型 (type) #
型を確認します。MyColor
はEnumType
クラスになります。
>>> type(MyColor)
enum.EnumType
>>> type(MyColor.RED)
<enum 'MyColor'>
メンバの値を省略する #
Enumのメンバの名前のみ重要で、値は必要ではない場合もあります。
そのような場合、enum.auto()
を使って番号を連番で与えることができます。
番号は1始まりで、1ずつ増加します。
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=}")
実行結果は以下になります。
MyColorAuto.RED.value=1
MyColorAuto.GREEN.value=2
MyColorAuto.BLUE.value=3
docstring #
列挙型のdocstringは公式にサポートされていないようです。 ただし、以下のように書くとVisual Studio Codeでdocstringの内容を表示できます。
class MyColor(Enum):
"""3 Colors."""
RED = "Red"
"""1st color."""
GREEN = "Green"
"""2nd color."""
BLUE = "Blue"
"""3rd color."""
型ヒント #
列挙型の型ヒントの例を示します。
ある関数my_func()
が列挙型MyColor
のメンバを引数に取る場合、以下のように型ヒントを書きます。
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
の挙動を確認します。
from enum import IntEnum
class MyColorI(IntEnum):
RED = 0
GREEN = 1
BLUE = 2
このように定義したMyColorI
のメンバは、整数との比較や演算が可能です。
また、メンバをint()
関数でキャストすると、整数の値を取得できます。
>>> MyColorI.RED == 0
True
>>> MyColorI.RED > 2
False
>>> MyColorI.RED + 5
5
>>> int(MyColorI.RED)
0
StrEnum #
str型と比較可能なStrEnum
の挙動を確認します。
from enum import StrEnum
class MyColorS(StrEnum):
RED = "Red"
GREEN = "Green"
BLUE = "Blue"
このように定義したMyColorS
のメンバは、通常の文字列と同様に比較や演算が可能です。
また、メンバをstr()
関数でキャストすると、文字列の値を取得できます。
>>> MyColorS.RED == "Red"
True
>>> MyColorS.RED + "Flower"
'RedFlower'
>>> MyColorS.RED * 2
'RedRed'
>>> len(MyColorS.RED)
3
>>> str(MyColorS.RED)
'Red'
なお、StrEnum
のメンバをenum.auto()
で定義すると、値は変数名の小文字になります。
class MyColorSAuto(StrEnum):
RED = auto()
GREEN = auto()
BLUE = auto()
print(MyColorSAuto.RED) # red
print(MyColorSAuto.GREEN) # green
print(MyColorSAuto.BLUE) # blue