파이썬에서 enum을 사용하면서 DEFAULT를 추가해야할지 예외처리를 해야할지 고민하면서 어떤차이가 있을까 고민을 하다가 나온 생각을 정리합니다.
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 메서드에서 처리될 수 있습니다.
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번 방식을 사용합니다.