열거

열거형 에서 Python

1개의 연습 문제

열거형 소개

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 쿡북을 참고해요.

GitHub에서 편집 링크가 새 창이나 탭에서 열려요