enum 클래스

수업할 때마다 파이썬에서는 상수를 정의할 수 없다라고 했느데,
이제는 그런 말을 할 수 없게 되었다.
3.4버전부터 추가된 내용으로 파이썬에서도 상수의 즐거움을 누릴 수 있게 되었다.
"파이썬 라이브러리 레시피"에서 발견한 두 번째 유익한 코드를 정리해 봤다.

enum은 상수를 정의할 때 쓰는 막강한 클래스를 말한다.
enumerate의 약자로 "값을 나열한다"는 뜻을 갖고 있다.
참.. 우리 말로는 열거형이라고 부른다.


import enum

# 여기서는 편의상 정수로만 지정했지만, 데이터 종류에 상관없이 상수를 지정할 수 있다.
# 실수, 문자열, 리스트 등의 모든 자료형을 사용할 수 있다.
class Color(enum.Enum):
RED = 0
GREEN = 1
BLUE = 2

print(Color) # <enum 'Color'>
print(Color.RED, Color.BLUE, Color.GREEN) # Color.RED Color.BLUE Color.GREEN

c = Color.RED
print(c) # Color.RED
c = Color.BLUE
print(c) # Color.BLUE

print(c.name) # BLUE
print(c.value) # 2
print(repr(Color.RED)) # <Color.RED: 0>
print(type(Color.RED)) # <enum 'Color'>
print(Color(0), Color(2)) # Color.RED Color.BLUE
print(Color['RED'], Color['BLUE']) # Color.RED Color.BLUE

if c == Color.RED: # Color is BLUE.
print('Color is RED.')
elif c == Color.GREEN:
print('Color is GREEN.')
else:
print('Color is BLUE.')

# enum을 정수와 비교하는 것은 항상 False.
if c == c.value: # DIFF.
print('SAME.')
else:
print('DIFF.')

# 리스트 인덱스로 사용
a = ['red', 'green', 'blue']

# print(a[c]) # error
# print(a[int(c)]) # error
print(a[c.value]) # blue
print('-'*50)

# 반복문에 적용할 수 있고, 아래와 같이 출력된다.
# Color.RED, Color.GREEN, Color.BLUE
for name in Color:
print(name)

names = list(Color)
print(names) # [<Color.RED: 0>, <Color.GREEN: 1>, <Color.BLUE: 2>]
print(names[0], names[-1]) # Color.RED Color.BLUE
print(names[0].name, names[0].value) # RED 0

print('-'*50)

# enum 클래스가 유일한 값들로만 구성되어야 한다면 unique 장식자(decoration) 사용.
# @enum.unique를 지정하면 아래 코드는 에러가 발생한다. 장식자는 클래스 바로 앞에 사용해야 한다.

# @enum.unique
class Foods(enum.Enum):
SNACK = 0
COKE = 1
CIDER = 1
JUICE = 1
PIZZA = 2
BURGER = 2


# 정수로만 구성된 상수 클래스 정의. 실수를 지정하면 정수로 자동 변환된다.
class City(enum.IntEnum):
SEOUL = 1
PUSAN = 2
INCHON = 3.3

print(City.SEOUL, City.PUSAN, City.INCHON) # City.SEOUL City.PUSAN City.INCHON
print(City.INCHON.name, City.INCHON.value) # INCHON 3
print('-'*50)

# dict 클래스(딕셔너리)의 key로 사용 가능
apples = {}
apples[Color.RED] = 'red delicious'
apples[Color.GREEN] = 'granny smith'
print(apples) # {<Color.GREEN: 1>: 'granny smith', <Color.RED: 0>: 'red delicious'}

# 3.6 버전에서는 auto 함수 가능. 1부터 시작하고 1씩 증가.
class NewColor(enum.Enum):
RED = enum.auto()
GREEN = enum.auto()
BLUE = enum.auto()

print(list(NewColor)) # [<NewColor.RED: 1>, <NewColor.BLUE: 2>, <NewColor.GREEN: 3>]

'파이썬' 카테고리의 다른 글

numba - 성능 업!  (0) 2017.04.18
pprint : 쉽고 예쁘게 출력하기  (0) 2017.04.09
구조체로 사용할 수 있는 collections.namedtuple  (0) 2017.04.09
defaultdict 사용법  (0) 2017.04.06
정규분포와 누적분포 비교 그래프  (0) 2017.04.06