파이썬에서 유익한 `Enum`의 동적 생성
Enum
를 사용하는 데 매우 흥미를 느꼈습니다. 그리고 두 언어의 열거형은 매우 다르지만 대부분의 현재 사용 사례에 대해 충분히 비슷합니다. 또한 Python 내에서 Enum
는 Typer
(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'>]
내가 원하는 것을 성취합니다.
Reference
이 문제에 관하여(파이썬에서 유익한 `Enum`의 동적 생성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/ivergara/dynamic-generation-of-informative-enum-s-in-python-1b22텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)