본문 바로가기

컴퓨터/파이썬 공부정리

[Python] from enum import Enum으로 Enum 사용하기

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 --- 열거형 지원 — 파이썬 설명서 주석판

열거형(enumeration)은 고유한 상숫값에 연결된 기호 이름(멤버)의 집합입니다. 열거형 내에서, 멤버를 아이덴티티로 비교할 수 있고, 열거형 자체는 이터레이트 될 수 있습니다. 모듈 내용 이 모듈�

python.flowdas.com


여기서부턴 뇌피셜:

여기서 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