파이썬에서 유익한 `Enum`의 동적 생성

4764 단어 pythonenum
Rust를 배우고 열거형을 알기 시작한 이후로 저는 Python에서 Enum 를 사용하는 데 매우 흥미를 느꼈습니다. 그리고 두 언어의 열거형은 매우 다르지만 대부분의 현재 사용 사례에 대해 충분히 비슷합니다. 또한 Python 내에서 EnumTyper (CLI) 및 FastAPI (API)와 같은 프레임워크에서 사용됩니다.

Python에서는 Enum without explicit member values이 다음과 같이 생성됩니다.

from enum import Enum, auto
class Color(Enum):
    RED = auto()
    BLUE = auto()
    GREEN = auto()

list(Color)
# [<Color.RED: 1>, <Color.BLUE: 2>, <Color.GREEN: 3>]


또는 functional API

from enum import Enum
Animal = Enum('Animal', 'ANT BEE CAT DOG', module=__name__)
list(Animal)
# [<Animal.ANT: 1>, <Animal.BEE: 2>, <Animal.CAT: 3>, <Animal.DOG: 4>]


엄청난! 문제는 외부 사용자와 인터페이스하는 Enum 를 가질 때 구성원의 정수 값이 거의 사용되지 않고 매우 유용하지 않다는 것입니다.

그렇기 때문에 값이 문자열인 다른 방식을 선호하는 경향이 있습니다.

class Animal(str, Enum):
    ANT = 'ant'
    BEE = 'bee'
    CAT = 'cat'
    DOG = 'dog'
list(Animal)
# [<Animal.ANT: 'ant'>,
#  <Animal.BEE: 'bee'>,
#  <Animal.CAT: 'cat'>,
#  <Animal.DOG: 'dog'>]


이제 제목에서 암시하는 실제 문제에 주의를 기울이십시오. 나는 약 15개의 가능한 요소의 다소 긴 세트를 가지고 있었고 값이 유익한 방식으로 Enum의 모든 요소를 ​​수동으로 직접 만들고 싶지 않았습니다. 그것이 바로 우리가 피하려고 하는 반복적인 수작업입니다.
함수형 API가 iterable과 함께 작동하는 것을 이미 보았으므로 기본적으로 문제는 이미 해결되었습니다. 그러나 이는 구성원 값이 정보가 되지 않는 방식으로 수행됩니다.

해결책은 목록(또는 예제에서는 문자열) 대신 사전을 제공하는 것입니다. 그러면 아래와 같이 사전의 (key, value) 쌍이 Enum의 멤버 이름과 값이 됩니다. 목록(또는 반복 가능)에서 사전으로 이동하는 것은 사전 이해를 통해 간단하게 달성됩니다.

Animal = Enum('Animal', {el:el.lower() for el in 'ANT BEE CAT DOG'.split(" ")}, type=str)
list(Animal)
# [<Animal.ANT: 'ant'>,
#  <Animal.BEE: 'bee'>,
#  <Animal.CAT: 'cat'>,
#  <Animal.DOG: 'dog'>]


내가 원하는 것을 성취합니다.

좋은 웹페이지 즐겨찾기