programing

python enum 클래스에서 모든 값을 가져오려면 어떻게 해야 합니까?

randomtip 2022. 12. 11. 10:24
반응형

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)

또는 여러 개를 가지고 있는 경우Enumclasses를 추출하고 싶다.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

반응형