본문 바로가기
Python Object-oriented Programming

num aliases & @enum.unique Decorator

by 자동매매 2023. 4. 4.

출처 : 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

댓글