メインコンテンツへスキップ

Pythonの列挙型Enumを検証

·1462 文字·3 分
目次

はじめに
#

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
#

MyColorMyColor.REDprint文で表示します。

>>> 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)
#

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

>>> 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クラス

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

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

参考
#

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

関連記事

【Python】dataclassの継承と初期値・型ヒント・メソッドのオーバーライド
·2442 文字·5 分
Pythonのdataclassを継承して派生クラスを作る方法、および初期値・型ヒント・メソッドのオーバーライドについて解説します。
pyproject.tomlからpip installコマンドでPythonのライブラリをインストールする
·1918 文字·4 分
Pythonのパッケージ設定ファイルpyproject.tomlに記載されたPythonのパッケージを、パッケージ管理システムpipでインストールする方法を解説します。
Scikit-learnのDecisionTreeClassifierクラスによる分類木
·3865 文字·8 分
分類木 (classification tree) は、分析したデータが属するカテゴリー(クラス)を予測する分類アルゴリズムの1つです。分類木では、Yes/Noによる分岐を何度か繰り返して、分類の予測を返します。
Cloudflare Pages上でSphinxサイトを自動デプロイする
·2235 文字·5 分
静的サイトホスティングサービスのCloudflare Pages上でドキュメント生成ツールSphinxを自動デプロイする手順を備忘録としてまとめました。
Sphinxでサイトマップを作る
·812 文字·2 分
Sphinxでサイト構造を示すサイトマップ (sitemap.xml) を作成する方法をまとめました。
Pythonのclassmethodとstaticmethodの使い分け
·1611 文字·4 分
Pythonのクラスにおいて、インスタンスメソッドとクラスメソッド (classmethod), スタティックメソッド (staticmethod) を使い分ける方法をまとめました。