Enum의 사용방식은 다음과 같다.
1. class를 이용해서 Enum을 정의
from enum import Enum
class Node(Enum):
apple = 1
banana = 2
orange = 3
print(Node)
>> <enum 'Node'>
class로 Node를 생성하면 enum type의 'Node'라는 이름의 obejct가 생성된다. Node 값을 참조하기 위해서 list나 tuple로 만들면 된다.
여기서 apple, banana, orange는 name이고 1,2,3은 value이다.
from enum import Enum
class Node(Enum):
apple = 1
banana = 2
orange = 3
print(list(Node))
>>> [<Node.apple: 1>, <Node.banana: 2>, <Node.orange: 3>]
Enum에 열거된 항목들을 value로 액세스 하려면 Node(n)으로 참조하면 된다.
key로 액세스 하려면 Node['key']로 참조하면 된다.
from enum import Enum
class Node(Enum):
apple = 1
banana = 2
orange = 3
print(Node(1))
>>> Node.apple
print(Node(2))
>>> Node.banana
print(Node['orange'])
>>> Node.orange
Node. 를 제외하고 value를 참조한다면 Node.name.value로, key를 참조한다면 Node.name.name으로 참조한다.
from enum import Enum
class Node(Enum):
apple = 1
banana = 2
orange = 3
print(Node.orange.value)
>>> 3
print(Node.orange.name)
>>> orange
for fruit in Node:
print(fruit.name, fruit.value)
>>> apple 1
>>> banana 2
>>> orange 3
만약 숫자를 지정하지 않고 자동으로 열거하고자 한다면 from enum import auto를 통해 auto를 불러온다. 그 뒤, name = auto()로 숫자를 자동으로 설정한다.
처음부터 숫자를 설정하지 않고 auto()로 설정한다면 0부터 시작하고, 이전의 name에 value를 임의의 숫자 n이라면, name.auto 했을 때 설정한 value는 n+1이다.
from enum import Enum, auto
class Node(Enum):
apple = auto()
banana = auto()
orange = auto()
for fruit in Node:
print(fruit.name, fruit.value)
>>> apple 1
>>> banana 2
>>> orange 3
from enum import Enum, auto
class Node(Enum):
apple = 7
banana = auto()
orange = auto()
for fruit in Node:
print(fruit.name, fruit.value)
>>> apple 7
>>> banana 8
>>> orange 9
2. 함수형 API로 enum 설정하기
from enum import Enum
Menu = Enum('Menu', ['apple', 'banana', 'orange'])
s = [f'({m.value}){m.name}' for m in Menu]
print(s)
>>> ['(1)apple', '(2)banana', '(3)orange']
여기서 'fruit'은 열거형의 이름이다.
그리고 두 번째부턴 열거형 이름의 소스이다. 여기엔 공백으로 구분된 이름의 string, sequence(튜플, 리스트), mapping(dictionary)이 올 수 있다.
여기서 sequence의 원소들을 (name, value)로 이루어진 튜플이나, 딕셔너리와 같이 {name:value}로 만들면 value를 사용자가 값을 설정할 수 있다. 이렇게 value를 설정하지 않으면 auto()처럼 1부터 차례대로 자동으로 설정한다.
from enum import Enum
Menu = list(Enum('Menu', ('apple', 'banana', 'orange')))
print(Menu)
>>> [<Menu.apple: 1>, <Menu.banana: 2>, <Menu.orange: 3>]
Menu = list(Enum('Menu', [('apple',4), ('banana',5), ('orange',6)]))
print(Menu)
>>> [<Menu.apple: 4>, <Menu.banana: 5>, <Menu.orange: 6>]
Menu = list(Enum('Menu', {'apple':7, 'banana':8, 'orange':9}))
print(Menu)
>>> [<Menu.apple: 7>, <Menu.banana: 8>, <Menu.orange: 9>]
name이나 value를 액세스하는 방법은 1번 방식과 같다.
from enum import Enum
Menu = Enum('Menu', {'apple':7, 'banana':8, 'orange':9})
print(Menu.apple)
>>> Menu.apple
print(Menu['apple'])
>>> Nemu.apple
print(Menu.apple.name)
>>> apple
print(Menu.apple.value)
>>> 7
for fruit in Menu:
print(fruit.name, fruit.value
>>> apple 7
>>> banana 8
>>> orange 9
출처:
https://python.flowdas.com/library/enum.html
여기서부턴 뇌피셜:
여기서 Enum의 첫번째 인자를 Menu가 아닌 다른 이름으로 설정해도 상관없지만 아무도 그렇게 안하는 것 같다... 헷갈리는 것 같아서 그러니 왠만하면 object의 이름과 Enum의 첫번째 요소인 멤버 이름의 소스를 같게하여 편하게 하자.
from enum import Enum
Menu = Enum('fruit', {'apple':7, 'banana':8, 'orange':9})
print(Menu.apple)
>>> fruit.apple
print(Menu['apple'])
>>> fruit.apple
print(Menu.apple.name)
>>> apple
print(Menu.apple.value)
>>> 7
for fruit in Menu:
print(fruit.name, fruit.value)
>>> apple 7
>>> banana 8
>>> orange 9
'컴퓨터 > 파이썬 공부정리' 카테고리의 다른 글
[phython] e-NFA를 DFA로 만드는 프로그램 (0) | 2020.11.10 |
---|---|
[Python] deque 기본 설정( deque(iterable, maxlen) ) (0) | 2020.09.02 |
[Python] index() 정리 (0) | 2020.09.01 |
[Python] for ~ else, while ~ else를 사용하는 방법 (0) | 2020.08.31 |
[Python] max(str, key=len) (0) | 2020.08.25 |