Masayan tech blog.

  1. ブログ記事一覧>
  2. PythonでEnum(列挙型)クラスを扱う方法

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

公開日

環境

  • Windows 10
  • Python 3.10.1
  • VSCode

実装

列挙型の定義方法

  • 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でEnum(列挙型)クラスを扱う方法について紹介しています。ぜひ参考にしてみてください