출처 : https://www.pythontutorial.net/python-oop/python-enum-unique/
Python Enumeration Aliases & @enum.unique
In this tutorial, you'll learn about enumeration aliases and how to use the enum unique decorator to ensure the uniqueness of member values.
www.pythontutorial.net
Introduction to the enum aliases
정의에 따라 열거형 멤버 값은 고유합니다. 그러나 동일한 값으로 다른 멤버 이름을 만들 수 있습니다.
예를 들어 다음은 Color 열거형을 정의합니다.
from enum import Enum
class Color(Enum):
RED = 1
CRIMSON = 1
SALMON = 1
GREEN = 2
BLUE = 3
이 예제에서 Color 열거형에는 값이 1인 RED, CRIMSON 및 SALMON 멤버가 있습니다.
동일한 값을 가진 열거형에서 여러 멤버를 정의하면 Python은 다른 멤버가 아니라 별칭(aliases)을 만듭니다.
이 예에서 RED는 기본 멤버(main member)이고 CRIMSON 및 SALMON 멤버는 RED 멤버의 별칭입니다.
다음 문은 CRIMSON과 SALMON 멤버가 RED meber이기 때문에 True를 반환합니다.
print(Color.RED is Color.CRIMSON) # True
print(Color.RED is Color.SALMON) # True
값으로 멤버를 조회하면 항상 별칭이 아닌 기본 멤버를 가져옵니다. 예를 들어 다음 문은 RED 멤버를 반환합니다.
print(Color(1)) # Color.RED
별칭이 있는 열거형의 멤버를 iterate하면 별칭이 아닌 기본 멤버만 가져옵니다. 예를 들어:
for color in Color:
print(color)
세 개의 멤버만 반환합니다.
Color.RED
Color.GREEN
Color.BLUE
별칭을 포함한 모든 멤버를 가져오려면 열거형 클래스의 __member__ 속성을 사용해야 합니다. 예를 들어:
from enum import Enum
from pprint import pprint
class Color(Enum):
RED = 1
CRIMSON = 1
SALMON = 1
GREEN = 2
BLUE = 3
pprint(Color.__members__)
Output:
mappingproxy({'BLUE': <Color.BLUE: 3>,
'CRIMSON': <Color.RED: 1>,
'GREEN': <Color.GREEN: 2>,
'RED': <Color.RED: 1>,
'SALMON': <Color.RED: 1>})
출력에서 명확하게 볼 수 있듯이 CRIMSON과 SALMON은 RED 멤버가 참조하는 동일한 개체를 참조합니다.
<Color.RED: 1>
When to use enum aliases
열거형 별칭은 일부 상황에서 유용할 수 있습니다. 예를 들어 서로 다른 두 시스템의 API를 처리해야 한다고 가정합니다 . 그리고 각 시스템은 다음 표와 같은 의미로 서로 다른 응답 상태를 갖습니다.
System 1 | System 2 | Meaning |
---|---|---|
REQUESTING | PENDING | 요청이 진행 중입니다. |
OK | FULFILLED | 요청이 성공적으로 완료되었습니다. |
NOT_OK | REJECTED | 요청이 실패했습니다. |
이러한 시스템의 상태 코드를 표준화하려면 다음과 같이 열거형 별칭을 사용할 수 있습니다.
Your System | System 1 | System 2 | Meaning |
---|---|---|---|
IN_PROGRESS | REQUESTING | PENDING | 요청이 진행 중입니다. |
SUCCESS | OK | FULFILLED | 요청이 성공적으로 완료되었습니다. |
ERROR | NOT_OK | REJECTED | 요청이 실패했습니다. |
다음은 별칭이 있는 응답 상태 열거형을 정의합니다.
from enum import Enum
class ResponseStatus(Enum):
# in progress
IN_PROGRESS = 1
REQUESTING = 1
PENDING = 1
# success
SUCCESS = 2
OK = 2
FULFILLED = 2
# error
ERROR = 3
NOT_OK = 3
REJECTED = 3
다음은 시스템 1의 응답 코드를 비교하여 요청이 성공했는지 여부를 확인합니다.
code = 'OK'
if ResponseStatus[code] is ResponseStatus.SUCCESS:
print('The request completed successfully')
Output:
The request completed successfully
마찬가지로 시스템 2의 응답 코드를 확인하여 요청이 성공했는지 확인할 수 있습니다.
code = 'FULFILLED'
if ResponseStatus[code] is ResponseStatus.SUCCESS:
print('The request completed successfully')
Output:
print('The request completed successfully')
@enum.unique decorator
별칭이 없는 열거형을 정의하려면 멤버에 고유한 값을 신중하게 사용할 수 있습니다. 예를 들어:
from enum import Enum
class Day(Enum):
MON = 'Monday'
TUE = 'Tuesday'
WED = 'Wednesday'
THU = 'Thursday'
FRI = 'Friday'
SAT = 'Saturday'
SUN = 'Sunday'
그러나 실수로 다음과 같이 두 멤버에 대해 동일한 값을 사용할 수 있습니다.
class Day(Enum):
MON = 'Monday'
TUE = 'Monday'
WED = 'Wednesday'
THU = 'Thursday'
FRI = 'Friday'
SAT = 'Saturday'
SUN = 'Sunday'
이 예제에서 TUE 멤버는 MON 멤버의 별칭이며 예상하지 못할 수 있습니다.
열거형에 별칭이 없도록 하려면 열거형 모듈에서 @enum.unique 데코레이터를 사용할 수 있습니다.
@enum.unique 데코레이터로 열거형을 데코레이팅할 때 , 파이썬은열거형에 별칭이 있으면 exception을 던집니다.
예를 들어 다음과 같이 하면 ValueError가 발생합니다.
import enum
from enum import Enum
@enum.unique
class Day(Enum):
MON = 'Monday'
TUE = 'Monday'
WED = 'Wednesday'
THU = 'Thursday'
FRI = 'Friday'
SAT = 'Saturday'
SUN = 'Sunday'
Error:
ValueError: duplicate values found in <enum 'Day'>: TUE -> MON
Summary
- 열거형에 동일한 값을 가진 여러 멤버가 있는 경우 첫 번째 멤버는 main member 이고 다른 멤버는 main member의 alias(별칭)입니다.
- 열거형 모듈의 @enum.unique 데코레이터를 사용하여 멤버 값의 고유성을 적용합니다.( 중복값이 있으면 raise exception )
- 별칭이 있는 열거형의 멤버를 iterate하면 별칭이 아닌 기본 멤버만 가져옵니다.
- 별칭을 포함한 모든 멤버를 가져오려면 열거형 클래스의 __member__ 속성을 사용해야 합니다.
'Python Object-oriented Programming' 카테고리의 다른 글
enum-auto (0) | 2023.04.04 |
---|---|
Customize and Extend Python Enum Class (0) | 2023.04.04 |
enumeration (0) | 2023.04.04 |
__slots__ Method (0) | 2023.04.04 |
overriding-method (0) | 2023.04.04 |
댓글