PythonでEnum(列挙型)クラスを扱う方法

環境

  • Windows 10
  • Python 3.10.1
  • VSCode

使用するソースコード

以下の公開リポジトリに置いています

GitHub - masayan1126/tao-py-py: pythonリポジトリ
pythonリポジトリ. Contribute to masayan1126/tao-py-py development by creating an account on GitHub.

実装

列挙型の定義方法

  • enumモジュールのEnumクラスを継承させることで定義可能
  • name = valueのワンセットで値を定義する
  • 変数名が name、値が value として扱われる

shared\Enums\SiteType.py

from enum import Enum

class SiteType(Enum):
    NOT_NEEDS_LOGIN = 1
    NEEDS_LOGIN_AND_ONE_STEP = 2
    NEEDS_LOGIN_AND_TWO_STEP = 3

shared\Enums\ScrapingType.py

from enum import Enum

class ScrapingType(Enum):
    SELENIUM = 1
    SOUP = 2  # BeautifulSoup

列挙型の呼び出し方法

  • 一般的な呼び出し方

    ScrapingType.SELENIUM // (constant) SELENIUM: Literal[ScrapingType.SELENIUM]
  • nameの呼び出し
    ScrapingType.SOUP.name // "SOUP"
  • valueの呼び出し
    ScrapingType.SOUP.value // 2
  • valueから値の呼び出し
    ScrapingType(1) // ScrapingType.SELENIUM

tests\Enum\test_scraping_type.py

※いずれもテストが通るパターンです

import pytest
from shared.Enums.ScrapingType import ScrapingType

# 数字で指定すると対応する値(ScrapingType.SELENIUM)が返る
def test_数字からスクレイピング種別を取得できる():
    assert ScrapingType(1) == ScrapingType.SELENIUM

# enumの識別子
def test_スクレイピング種別の識別子を取得できる():
    assert ScrapingType.SOUP.name == "SOUP"

# enumの値
def test_スクレイピング種別の値を取得できる():
    assert ScrapingType.SOUP.value == 2

def test_存在しない種別の場合は例外():
    with pytest.raises(ValueError):
        ScrapingType(99) == ScrapingType.SELENIUM

補足

以下のように数値と比較することはできないため、数値と比較したい場合は、IntEnumクラスを使用する必要がある

ScrapingType.SELENIUM == 1

IntEnumクラスはEnum クラスとintのサブクラスになっているで、IntEnumのメンバーは int型と比較することができる

定義方法等は基本的にEnumクラスと同様

from enum import IntEnum

class IntEnumSample(IntEnum):
  name = value
  .
  .
  .

Python学習におすすめの書籍

独習Python/山田祥寛【3000円以上送料無料】
bookfan 1号店 楽天市場店
¥ 3,300(2022/02/05 17:20時点)
タイトルとURLをコピーしました