소프트웨어에 대한 모든 것

[파이썬] enum 열거형 본문

파이썬

[파이썬] enum 열거형

앤테바 2022. 3. 29. 09:52
반응형

 

파이썬도 열거형 enum을 지원합니다.

열거형(enumeration)은 고유한 상수값에 연결된 기호 이름의 집합니다.

열거형은 상수를 나타내는 데 보통 사용되기 때문에 열거형 멤버에 대핸 대문자로 사용하는 것을 지향합니다.

Enum형 만들기

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3

print(type(Color.GREEN))
print(Color.GREEN)
print(Color.GREEN.name)

출력

<enum 'Color'>
Color.GREEN
GREEN

Enum형 반복하기(이터레이션 지원)

열거형은 정의 순서로 이터레이션을 지원합니다.

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
    
for color in Color:
    print(color)

출력

Color.RED
Color.GREEN
Color.BLUE

Enum형 자동 값 사용하기(auto)

열거형에 상수값을 지정할 때 값이 중요하지 않으면 auto를 사용할 수 있습니다.

from enum import Enum, auto

class Color(Enum):
    RED = auto()
    GREEN = auto()
    BLUE = auto()
    
print(list(Color))

출력

[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]

Enum형 비교

열거형 멤버는 동등 비교는 할 수 있습니다.

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
    
print(Color.RED is Color.RED)
print(Color.RED == Color.RED)

print(Color.RED is not Color.RED)
print(Color.RED != Color.RED)

출력

True
True
False
False

 

그렇지만, 값 사이의 순서 비교는 지원되지 않습니다.

왜냐하면 열거형 멤버는 정수가 아니기 때문입니다!!! (IntEnum을 상속 받았다면 가능)

from enum import Enum

class Color(Enum):
    RED = 1
    GREEN = 2
    BLUE = 3
    
print(Color.RED < Color.GREEN)

출력

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_9360/1484130010.py in <module>
      6     BLUE = 3
      7 
----> 8 print(Color.RED < Color.GREEN)

TypeError: '<' not supported between instances of 'Color' and 'Color'

Enum형 함수형 API 선언

Enum형을 class로 정의하지 않고 함수형 api로 간단하게 정의할 수 있습니다.

첫 번째 인자는 열거형의 이름이고, 두 번째 인자는 열거형 멤버 이름의 소스입니다.

from enum import Enum

Color = Enum(value='Color', names='RED GREEN BLUE', start=1)
list(Color)

출력

[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]

Enum 파생된 열거형

IntEnum

Enum이 아닌 IntEnu을 상속 받습니다.

Enum에서는 대소 비교가 안되었지만 IntEnum형은 대소 비교가 가능합니다.

즉, IntEnum형은 정수처럼 동작하는 것입니다.

from enum import IntEnum

class Color(IntEnum):
    RED = 1
    GREEN = 2
    BLUE = 3
    
print(list(Color))
print(Color.RED < Color.BLUE)

출력

[<Color.RED: 1>, <Color.GREEN: 2>, <Color.BLUE: 3>]
True

IntFlag

IntFlag도 int를 기반으로 합니다. 차이점은 IntFlag 멤버는 비트 연산자(&, |, ^, ~)를 사용하여 결합할 수 있으며 결과는 여전히 IntFlag 멤버라는 것입니다.

from enum import IntFlag

class Permission(IntFlag):
    R = 4
    W = 2
    X = 1
    
RW = Permission.R | Permission.W
print(RW)
print(int(RW))

print(Permission.R in RW)
print(Permission.X in RW)

출력

Permission.R|W
6
True
False

 

참고 자료

https://docs.python.org/3/library/enum.html

반응형
Comments