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 |