출처 : https://www.pythontutorial.net/python-oop/python-enum-unique/
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 |
댓글