[python] enum 모듈 - 직접 지정과 auto()

gunny·2025년 3월 4일
0

Python

목록 보기
34/35

auto()

  • python의 enum 모듈에서 제공하는 기능
  • 자동으로 Enum 멤버의 값을 설정해주는 역할

사용법

[1] Enum

  • 보통 Enum을 만들 때는 직접 값을 지정한다.
    auto() 를 사용하면 python이 알아서 값을 정해준다.
from enum import Enum, auto

class Color(Enum):
	RED = auto()
   	GREEN = auto()
    BLUE = auto()
    

print(Color.RED.value) # 1
print(Color.GREEN.value) # 2
print(Color.BLUE.value) # 3
  • 여기서 auto()가 자동으로 1, 2, 3을 할당해준다.
    Enum은 기본적으로 정수 값을 가지기 때문에 auto()를 쓰면 1부터 시작해서 1씩 증가하는 값이 들어간다.

[2] 직접 지정 + Enum

class MyEnum(Enum):
	A = 10
    B = auto()
    C = auto()
    
print(MyEnum.A.value) # 10
print(MyEnum.B.value) # 11
print(MyEnum.C.value) # 12
  • A=10 으로 설정했기 때문에 auto()는 그 다음 숫자인 11, 12를 자동으로 넣어준다.

[3] auto() 를 활용한 Enum 확장

  • auto()를 사용하면 항상 일관된 방식으로 값이 자동 설정되기 때문에, 새로운 멤버를 추가할 때 실수할 가능성이 줄어즌다.
class Status(Enum):
	PENDING = auto()
    IN_PROGRESS = auto()
    COMPLETED = auto()
    
# 나중에 새로운 상태 추가하기 쉬움

class ExtendedStatus(Status):
	FAILED = auto()
    
print(ExtenedeSttatus.FAILED.value) # 4 (자동 증가)
  • 수동으로 값을 지정하면 중복되거나 실수할 가능성이 있는데, auto()를 쓰면 자동 설정되어 유지보수가 편리하다.

[4] StrEnum + auto

from enum import StrEnum, auto

class OpenAIChatModelsEnum(StrEnum):
	GPT4O = auto()
    GTP4O_MINI = auto()
    
print(OpenAIChatModelsEnum.GPT4O.value) # "GPT4O"
print(OpenAIChatModelsEnum.GPT4O_MINI.value) # "GPT4O_MINI"
  • Enum에서는 숫자가 자동으로 들어가지만 StrEnum 에서는 멤버 이름을 그대로 문자열 값으로 설정한다.
  • 즉 GPT4O = "GPT4O", "GPT4O_MINI" = "GPT4O_MINI" 로 자동변환된다.

[5] StrEnum 의 확장

  • StrEnum에서의 확장이 필요한 경우는 새로운 Enum을 추가하면서 기존 값과 비교해야 할 때이다.
    예를 들면 API 응답에 따라 상태를 관리하는 경우
class BaseStatus(StrEnum):
	SUCCESS = "SUCCESS"
    ERROR = "ERROR"
    
class ExtendedStatus(BaseStatus):
	TIMEOUT = "TIMEOUT"
    RETRY = "RETRY"
    
print(ExtendedStatus.TIMEOUT in BaseStatus) # False (BaseStatus에는 없음) 
print(ExtendedStatus.SUCCESS in BaseStatus) # True (BaseStatus에 있음)
  • 이렇게 하면 기본 상태(BaseStatus)와 새로운 상태(ExtendedStatus)를 구분할 수 있다.
  • StrEnumauto() 가 그냥 멤버 이름을 값으로 설정하므로 확장할 필요가 없고, 새로운 StrEnum을 만들고 직접 값을 넣는게 더 직관적일 수 있다.

직접 값 지정 vs auto()

직접 값 지정

class MyEnum(StrEnum):
	A = "Apple"
    B = "Banana"

print(MyEnum.A.value) # "Apple"
print(MyEnum.B.value) # "Banana"

auto()

class MyEnum(StrEnum):
	A = auto()
    B = auto()
    
print(MyEnum.A.value) # "A"
print(MyEnum.B.value) # "B"
  • 값을 따로 지정하고 싶을 때 -> 직접 입력
  • 멤버 이름을 그대로 값으로 쓰고 싶다면 auto() 사용

예를 들어서 GPT4O 라는 값이 아니라 gpt-4o 처럼 다른 값을 쓰고 싶다면 auto() 대신에 직접 값을 입력한다.

profile
꿈꾸는 것도 개발처럼 깊게

0개의 댓글