Python에서 enum은 고유한 이름들이 각각 고유한 상수 값에 묶여 있는 집합이에요.
Enums는 Enum 클래스를 상속해서 정의해요.
내장 enum 타입은 enum 모듈에서 사용할 수 있고, Enum 클래스는 from enum import Enum으로 임포트할 수 있어요.
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
enum 멤버의 값은 str, tuple, float 등 어떤 데이터 타입이든 될 수 있다는 점에 유의해요.
class Color(Enum):
RED = 'red'
GREEN = 'green'
Enums는 함수 호출 문법으로도 만들 수 있어요.
from enum import Enum
Animal = Enum('Animal', 'ANT BEE CAT DOG')
list(Animal)
#=> [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]
Animal.ANT.value
#=> 1
enum에서 두 멤버에 같은 값을 할당하면, 나중에 할당된 멤버가 먼저 할당된 멤버의 별칭이 돼요. enum의 서로 다른 두 멤버에 같은 이름을 사용하는 것은 허용되지 않아요.
class Color(Enum):
RED = 1
GREEN = 2
ALIAS_OF_RED = 1
Color.ALIAS_OF_RED
#=> <Color.RED: 1>
enum의 멤버를 순회하려면 표준 for member in 문법을 사용하면 돼요:
for member in Color:
print((member.name, member.value))
#=> (RED, 1)
#=> (GREEN, 2)
# __members__.items() helps you to loop through alias as well
for member in Color.__members__.items():
print(member)
#=> ('RED', <Color.RED: 1>)
#=> ('GREEN', <Color.GREEN: 2>)
#=> ('ALIAS_OF_RED', <Color.RED: 1>)
Enum 멤버는 is (식별 연산자)나 is not으로 비교할 수 있어요. ==나 != (동등 연산자)도 마찬가지로 동작해요:
a = Color.RED
a is Color.RED
#=> True
a == Color.RED
#=> True
정수 값을 할당하려면, auto() 함수가 1부터 시작해서 이후 값을 자동으로 설정해요.
class Shape(Enum):
CIRCLE = auto()
SQUARE = auto()
OVAL = auto()
별칭을 허용하지 않으려면 (서로 다른 이름으로 중복 값을 만드는 것을 막으려면), 클래스 데코레이터인 @enum.unique 데코레이터를 사용할 수 있어요.
@enum.unique
class Shape(Enum):
CIRCLE = 1
SQUARE = 2
TRIANGLE = 1
#=> ValueError: duplicate values found in <enum 'Shape'>: TRIANGLE -> CIRCLE
주어진 값에 해당하는 enum 멤버에 접근하려면, <EnumName>(<value>) 표기를 사용할 수 있어요.
g = Color(2)
g is Color.GREEN
#=> True
g
#=> <Color.GREEN: 2>
임의의 믹스인이나 데이터 타입으로 Enum 클래스를 상속해서 사용자 정의 제한된 Enum을 작성할 수 있어요.
예를 들어:
class StrEnum(str, Enum):
pass
Enum을 상속하는 것은 enum이 멤버를 하나도 정의하지 않은 경우에만 허용돼요.
더 자세한 내용과 설명은 enum 사용법과 enum 쿡북을 참고해요.