概要
列挙型(Enum)は、複数の選択肢を意味づけ付きで表現するための構造であり、
「値の集合」に対する意味論的制御と、安全性・保守性の両立をもたらす。
Python 3.4以降の標準ライブラリ enum
モジュールにより、
定数群の羅列から脱却した、意図を持つ設計が可能となる。
本稿では Enum
の基本構文から、IntEnum
, auto
, フラグの応用、シリアライズ、実務設計パターンまで
列挙型による堅牢で読みやすいコード構築法を解説する。
1. 列挙型とは?
列挙型は「定数の名前」と「実際の値」をペアで定義する構造であり、
以下のような従来の定数定義の欠点を克服する。
# 従来
STATUS_ACTIVE = 1
STATUS_INACTIVE = 2
STATUS_SUSPENDED = 3
→ ✅ Enum
を使うことで、型・意味・可読性の三位一体な制御が可能
2. 基本的な Enum
の定義と使用
from enum import Enum
class Status(Enum):
ACTIVE = 1
INACTIVE = 2
SUSPENDED = 3
s = Status.ACTIVE
print(s.name) # 'ACTIVE'
print(s.value) # 1
-
Enum
の各メンバーは ユニークかつ不変 - 名前による比較が可能で、Magic numberの排除につながる
3. IntEnum
と整数互換性
from enum import IntEnum
class Priority(IntEnum):
LOW = 1
MEDIUM = 2
HIGH = 3
assert Priority.HIGH > Priority.LOW # True
-
IntEnum
は int としての比較やソートが可能 - DBとの連携やソート処理を伴う場合に有用
4. auto()
による自動割り当て
from enum import Enum, auto
class Mode(Enum):
READ = auto()
WRITE = auto()
EXECUTE = auto()
→ auto()
によって値を意識せず定義できる
→ 意味論に集中できる構文美とメンテナンス性を両立
5. フラグ型:ビット演算による複合状態管理
from enum import Flag, auto
class Permission(Flag):
READ = auto()
WRITE = auto()
EXECUTE = auto()
perm = Permission.READ | Permission.WRITE
print(perm) # Permission.READ|WRITE
-
Flag
により 複数状態の合成・検査が可能 - 権限・状態ビット・オプション設定に適用可能
6. 実務でのユースケース
✅ 状態管理(ステータスマシンの定義)
class UserStatus(Enum):
ACTIVE = "active"
INACTIVE = "inactive"
BANNED = "banned"
✅ REST API のフィルタ条件
class SortOrder(Enum):
ASC = "asc"
DESC = "desc"
✅ 型ヒントとの併用で明示的制約
def get_users(status: UserStatus) -> list:
...
→ 不正な値の流入を事前に防ぐ設計
7. シリアライズ/デシリアライズへの対応
import json
class Role(Enum):
ADMIN = "admin"
USER = "user"
r = Role.ADMIN
json_str = json.dumps({"role": r.value}) # → {"role": "admin"}
→ Enumは .value
を使ってシリアライズ
→ .value
→ コンストラクタで復元
Role("admin") # → Role.ADMIN
8. よくある誤用と対策
❌ 値だけで比較する
if user.status == "active": # NG
→ ✅ Enum での比較は名前ベースで行う
if user.status == UserStatus.ACTIVE:
❌ DBや外部APIとの整合性を意識しない
→ ✅ IntEnum
や str
値を持つ Enum
を定義し、
→ 双方向マッピングの責務を明確化する
結語
Enum
は、Pythonにおける「意味を持つ選択肢」を明示的に制御するための設計構造である。
- 定数の集まりを クラスと型で管理することで保守性を向上
- 不正な値を防ぎ、選択肢の意図を型・構文レベルで保証
-
auto
,IntEnum
,Flag
などによって 多様な文脈に適応
Pythonicとは、“値に意味を与える”ことであり、
Enumはその思想を、コードに確固たる秩序として付与する設計武器である。