python enum 클래스에서 모든 값을 가져오려면 어떻게 해야 합니까?
Enum4 라이브러리를 사용하여 다음과 같이 Enum 클래스를 만듭니다.
class Color(Enum):
RED = 1
BLUE = 2
인쇄하고 싶다[1, 2]
어디선가 목록으로.어떻게 하면 좋을까요?
다음을 수행할 수 있습니다.
[e.value for e in Color]
@Jeff의 답변에 따라 리팩터링하여classmethod
따라서 동일한 코드를 임의의 에넘에 재사용할 수 있습니다.
from enum import Enum
class ExtendedEnum(Enum):
@classmethod
def list(cls):
return list(map(lambda c: c.value, cls))
class OperationType(ExtendedEnum):
CREATE = 'CREATE'
STATUS = 'STATUS'
EXPAND = 'EXPAND'
DELETE = 'DELETE'
print(OperationType.list())
작성:
['CREATE', 'STATUS', 'EXPAND', 'DELETE']
IntEnum을 사용할 수 있습니다.
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
print(int(Color.RED)) # prints 1
int 목록을 가져오려면:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
사용하다_member_names_
이름만 있으면 쉽게 얻을 수 있습니다.
Color._member_names_
또, 당신은_member_map_
순서대로 정렬된 요소 사전을 반환합니다.이 함수는 a를 반환합니다.collections.OrderedDict
그럼, 당신은Color._member_map_.items()
그리고.Color._member_map_.values()
가지고 놀 수 있어요.예.
return list(map(lambda x: x.value, Color._member_map_.values()))
Color의 모든 유효한 값을 반환합니다.
Enum을 임의의 유형의 값과 함께 사용하려면 다음을 수행합니다.
몇 가지 개선 사항이 업데이트됨...@Jeff씨 감사합니다!
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 'GREEN'
BLUE = ('blue', '#0000ff')
@staticmethod
def list():
return list(map(lambda c: c.value, Color))
print(Color.list())
그 결과:
[1, 'GREEN', ('blue', '#0000ff')]
학급enum.Enum
는, 모든 열거 요구를 해결하는 클래스이기 때문에, 그 클래스로부터 상속해, 독자적인 필드를 추가하는 것만으로 끝납니다.그 후, 그 속성을 호출하기만 하면 됩니다.name
&value
:
from enum import Enum
class Letter(Enum):
A = 1
B = 2
C = 3
print({i.name: i.value for i in Letter})
# prints {'A': 1, 'B': 2, 'C': 3}
사용방법classmethod
와 함께__members__
:
class RoleNames(str, Enum):
AGENT = "agent"
USER = "user"
PRIMARY_USER = "primary_user"
SUPER_USER = "super_user"
@classmethod
def list_roles(cls):
role_names = [member.value for role, member in cls.__members__.items()]
return role_names
>>> role_names = RoleNames.list_roles()
>>> print(role_names)
또는 여러 개를 가지고 있는 경우Enum
classes를 추출하고 싶다.classmethod
:
class BaseEnum(Enum):
@classmethod
def list_roles(cls):
role_names = [member.value for role, member in cls.__members__.items()]
return role_names
class RoleNames(str, BaseEnum):
AGENT = "agent"
USER = "user"
PRIMARY_USER = "primary_user"
SUPER_USER = "super_user"
class PermissionNames(str, BaseEnum):
READ = "updated_at"
WRITE = "sort_by"
READ_WRITE = "sort_order"
그래서...Enum
가 있다__members__
dict. @ozgur가 제안한 해결책은 정말 최고입니다. 하지만 당신은 이것을 할 수 있습니다. 같은 일을 하면서 더 많은 일을 할 수 있습니다.
[color.value for color_name, color in Color.__members__.items()]
그__members__
사전은 역동적으로 삽입하고 싶을 때 편리합니다.어떤 미친 상황에서요
[편집] 그런 것 같아__members__
는 사전이 아니라 맵 프록시입니다.즉, 아이템을 쉽게 추가할 수 없습니다.
하지만 이런 이상한 짓은 할 수 있다.MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
새로운 키를 사용하여 다음과 같이 할 수 있습니다.MyEnum.new_key
.... 하지만 이것은 구현 세부 사항일 뿐이므로 조작해서는 안 됩니다.블랙 매직에는 막대한 유지비가 소요됩니다.
당신은 가질 수 있다.SuperEnum
예를 들어 다음과 같습니다.
from enum import Enum
class SuperEnum(Enum):
@classmethod
def to_dict(cls):
"""Returns a dictionary representation of the enum."""
return {e.name: e.value for e in cls}
@classmethod
def keys(cls):
"""Returns a list of all the enum keys."""
return cls._member_names_
@classmethod
def values(cls):
"""Returns a list of all the enum values."""
return list(cls._value2member_map_.keys())
다음과 같이 사용합니다.
class Roles(SuperEnum):
ADMIN = 1
USER = 2
GUEST = 3
다음과 같은 작업을 수행할 수 있습니다.
Roles.to_dict() # {'ADMIN': 1, 'USER': 2, 'GUEST': 3}
Roles.keys() # ['ADMIN', 'USER', 'GUEST']
Roles.values() # [1, 2, 3]
표준 python3 Enum/IntEnum 클래스에 기반한 열거형 지정:
from enum import IntEnum
class LogLevel(IntEnum):
DEBUG = 0
INFO = 1
WARNING = 2
ERROR = 3
다음 작업을 수행하여 열거형 상수 목록을 가져올 수 있습니다.
>>> print(list(LogLevel))
[<LogLevel.DEBUG: 0>, <LogLevel.INFO: 1>, <LogLevel.WARNING: 2>, <LogLevel.ERROR: 3>]
ints 대신 열거형 상수로 작업하는 것이 더 표현력 있다고 생각합니다.열거형이 IntEnum에서 상속되는 경우 모든 열거형 상수도 int이며 어디에서나 사용할 수 있습니다.
>>> level = LogLevel.DEBUG
>>> level == 0
True
>>> level == 1
False
>>> level == LogLevel.INFO
False
>>> level == LogLevel.DEBUG
True
>>> "%d" % level
'0'
>>> "%s" % level
'LogLevel.DEBUG'
한 가지 방법은 키 취득입니다._value2member_map_
속성:
class Color(Enum):
RED = 1
BLUE = 2
list(Color._value2member_map_.keys())
# [1, 2]
사용방법:
[e.value for e in Color]
작성:
[1, 2]
이름을 얻으려면 다음을 사용합니다.
[e.name for e in Color]
작성:
['빨강', '파랑']
다음은 Enum을 int, str 또는 Enum의 목록/배열로 쉽게 변환하고 정렬할 수 있는 예를 보여 줍니다.
import numpy as np
class Color(int,Enum):
YELLOW = 3
RED = 1
BLUE = 2
print('1):',list(Color))
print('2):',np.array(list(Color))) ## int64 (8 bytes)
print('3):',sorted(np.array(Color, dtype=str)))
print('4):',np.array(sorted(Color), dtype=object))
print('5):',np.array(sorted(Color), dtype=np.int8)) # 1 byte
print('6):',np.array(sorted(Color, key=lambda x: -x.value), dtype=np.int8))
print('7):',np.array(sorted(Color, key=lambda x: str(x)), dtype=np.int8))
class Color(tuple,Enum):
YELLOW = (3,3)
RED = (1,1)
BLUE = (2,2)
print('8):',np.array(sorted(Color)))
print('9):',list(map(tuple,sorted(Color, key=lambda x: -x[1]))))
출력:
1): [<Color.YELLOW: 3>, <Color.RED: 1>, <Color.BLUE: 2>]
2): [3 1 2]
3): ['Color.BLUE', 'Color.RED', 'Color.YELLOW']
4): [<Color.RED: 1> <Color.BLUE: 2> <Color.YELLOW: 3>]
5): [1 2 3]
6): [3 2 1]
7): [2 1 3]
8): [[1 1]
[2 2]
[3 3]]
9): [(3, 3), (2, 2), (1, 1)]
언급URL : https://stackoverflow.com/questions/29503339/how-to-get-all-values-from-python-enum-class
'programing' 카테고리의 다른 글
MVC는 JSF MVC 프레임워크에서 어떤 컴포넌트입니까? (0) | 2022.12.11 |
---|---|
Vue + Django 템플릿 언어를 사용할 때 이중 괄호 문제는 어떻게 해결합니까? (0) | 2022.12.11 |
phpMyAdmin을 사용하여 mysql 서버에 액세스할 수 없습니다. (0) | 2022.12.11 |
Vue CLI는 운영 환경을 위해 최소화되지만 속성 및 기타 정의도 어떻게 단축할 수 있습니까? (0) | 2022.12.11 |
PHP에서 cURL 오류를 캐치하는 방법 (0) | 2022.12.01 |