[Python] Enum 은 어떻게 사용하죠?

devhans·2024년 6월 27일

Python

목록 보기
3/8
post-thumbnail

배경

파이썬에서 enum을 사용하면서 DEFAULT를 추가해야할지 예외처리를 해야할지 고민하면서 어떤차이가 있을까 고민을 하다가 나온 생각을 정리합니다.

python에서의 enum 사용 방식

1. 잘못된 인자값을 받는 경우 ValueError를 일으키기

from enum import Enum
from typing import Any


class ExecType(Enum):
    THREAD = "thread"
    PROCESS = "process"

    @classmethod
    def _missing_(cls, value: Any):
        for member in cls:
            if member.value == value:
                return member
        raise ValueError(f"{value} is not a valid {cls.__name__}")


if __name__ == "__main__":
    print(ExecType("thread"))  # ExecType.TASK
    print(ExecType("process"))  # ExecType.RULE
    print(ExecutorType("invalid"))  # ValueError: invalid is not a valid ExecType

pros:
정의된 멤버 중 하나와 정확히 일치하지 않는 경우 예외를 발생시킵니다.
그 외의 경우에는 예외 처리할 수 있습니다.

cons:
실수로 정의된 멤버와 겹치는 값을 입력하면 예외를 발생시키지 않습니다, missing 메서드에서 처리될 수 있습니다.

2. 잘못된 인자값을 받는 경우 기본값을 사용

from enum import Enum

class ExecType(Enum):
    THREAD = "thread"
    PROCESS = "process"
    DEFAULT = "default"  # 추가된 default 멤버

    @classmethod
    def _missing_(cls, value):
        return cls.UNKNOWN  # 정의되지 않은 값은 UNKNOWN으로 처리

if __name__ == "__main__":
    print(ExecType("thread"))  # ExecType.TASK
    print(ExecType("process"))  # ExecType.RULE
    print(ExecutorType("invalid"))  # ExecType.DEFAULT

pros:
명시적으로 기본 값을 나타내는 멤버를 추가하여 코드가 명확해질 수 있습니다.
예외를 발생시키지 않고, 알 수 없는 경우에 대한 기본 처리를 제공할 수 있습니다.

cons:
추가적인 처리 로직이나 예외 처리가 필요할 수 있습니다.

그래서 어떤방식을 선택할 것인가?

필요에 따라 선택하면 됩니다.
잘못된 인자값을 받았을 때 예외로 발생시키고 싶으면 1번 방식을 사용합니다.
잘못된 인자값을 받았을 때 기본처리를 진행하는 로직을 작성하려면 2번 방식을 사용합니다.

profile
책 읽고 운동하기

0개의 댓글