雑念ストレージ

プログラミング関連のメモとか

【Python】Enumで処理を分岐するなら、デフォルトの分岐はエラーにしておいたほうがいい気がする

Pythonで↓のようにEnumを分岐する処理を書いてみた。

from blood_types import BloodTypes


def uranai(blood_type: BloodTypes):
    """血液型占い"""

    match blood_type:
        case BloodTypes.A:
            print("大吉")
        case BloodTypes.B:
            print("中吉")
        case BloodTypes.O:
            print("小吉")

PythonJavaなどと違って、matchのルートに漏れがあってもコンパイルエラーにはしてくれない。
そのせいで、Enumに要素を追加する際に、実装漏れがないか結構気を使う。
(実際、↑のコードはAB型のルートが実装漏れしている)

そこで、以下のようにデフォルトのルートをNotImplementedErrorにしてみた。

from blood_types import BloodTypes


def uranai(blood_type: BloodTypes):
    """血液型占い"""

    match blood_type:
        case BloodTypes.A:
            print("大吉")
        case BloodTypes.B:
            print("中吉")
        case BloodTypes.O:
            print("小吉")
        case _:
            raise NotImplementedError()

↑の修正に加えて、Enumの全パターンを通すようなユニットテストも用意する。

import unittest

import blood_type_uranai
from blood_types import BloodTypes


class BloodTypeUranaiTest(unittest.TestCase):
    def test_uranai(self):
        # 全部の血液型で、エラーにならないことを確認
        for blood_type in BloodTypes:
            blood_type_uranai.uranai(blood_type)

こういうユニットテストを用意しておけば、
Enumに要素が追加された場合に実装漏れしている処理があっても、テストがコケるのですぐに気がつくはず。