프로그래밍 언어/Python

파이썬에서 'Enum'을 표현하는 방법

Rateye 2021. 12. 7. 10:15
728x90
반응형
질문 : 파이썬에서 '열거 형'을 어떻게 표현할 수 있습니까?

저는 주로 C # 개발자이지만 현재 Python으로 프로젝트를 진행하고 있습니다.

파이썬에서 Enum에 해당하는 것을 어떻게 나타낼 수 있습니까?

답변

PEP 435에 설명 된대로 열거 형 이 Python 3.4에 추가되었습니다. 또한 pypi 에서 3.3, 3.2, 3.1, 2.7, 2.6, 2.5 및 2.4로 백 포트되었습니다.

고급 열거 기술이 시도를 위해 aenum 라이브러리 (2.7, 3.3 이상, 동일 저자 enum34 . 코드는 당신이 필요합니다 py2 및 py3, 예를 들어 사이에 완벽하게 호환되지 않습니다 __order__ 파이썬 2 ).

  • enum34 를 사용하려면 $ pip install enum34
  • aenum 을 사용 $ pip install aenum

enum (숫자 없음)을 설치하면 완전히 다른 호환되지 않는 버전이 설치됩니다.


from enum import Enum     # for enum34, or the stdlib version
# from aenum import Enum  # for the aenum version
Animal = Enum('Animal', 'ant bee cat dog')

Animal.ant  # returns <Animal.ant: 1>
Animal['ant']  # returns <Animal.ant: 1> (string lookup)
Animal.ant.name  # returns 'ant' (inverse lookup)

또는 동등하게 :

class Animal(Enum):
    ant = 1
    bee = 2
    cat = 3
    dog = 4

이전 버전에서 열거 형을 수행하는 한 가지 방법은 다음과 같습니다.

def enum(**enums):
    return type('Enum', (), enums)

다음과 같이 사용됩니다.

>>> Numbers = enum(ONE=1, TWO=2, THREE='three')
>>> Numbers.ONE
1
>>> Numbers.TWO
2
>>> Numbers.THREE
'three'

다음과 같이 자동 열거를 쉽게 지원할 수도 있습니다.

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    return type('Enum', (), enums)

다음과 같이 사용됩니다.

>>> Numbers = enum('ZERO', 'ONE', 'TWO')
>>> Numbers.ZERO
0
>>> Numbers.ONE
1

값을 다시 이름으로 변환하는 지원은 다음과 같이 추가 할 수 있습니다.

def enum(*sequential, **named):
    enums = dict(zip(sequential, range(len(sequential))), **named)
    reverse = dict((value, key) for key, value in enums.iteritems())
    enums['reverse_mapping'] = reverse
    return type('Enum', (), enums)

이것은 그 이름을 가진 모든 것을 덮어 쓰지만 출력에서 열거 형을 렌더링하는 데 유용합니다. 역 매핑이 존재하지 않으면 KeyError가 발생합니다. 첫 번째 예 :

>>> Numbers.reverse_mapping['three']
'THREE'

mypy를 사용하는 경우 "열거 형"을 표현하는 또 다른 방법은 Literal 입니다.

예를 들면

from typing import Literal #python >=3.8
from typing_extensions import Literal #python 2.7, 3.4-3.7


Animal = Literal['ant', 'bee', 'cat', 'dog']

def hello_animal(animal: Animal):
    print(f"hello {animal}")

hello_animal('rock') # error
hello_animal('bee') # passes
출처 : https://stackoverflow.com/questions/36932/how-can-i-represent-an-enum-in-python
728x90
반응형