如何从 python 枚举 class 中获取所有值?
How to get all values from python enum class?
我正在使用 Enum4 库创建枚举 class,如下所示:
class Color(Enum):
RED = 1
BLUE = 2
我想在某处打印 [1, 2]
作为列表。我怎样才能做到这一点?
您可以使用 IntEnum:
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
print(int(Color.RED)) # prints 1
获取整数列表:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
您可以执行以下操作:
[e.value for e in Color]
所以 Enum
有一个 __members__
字典。
@ozgur 提出的解决方案确实是最好的,但是你可以这样做,做同样的事情,但需要更多的工作
[color.value for color_name, color in Color.__members__.items()]
如果您想在其中动态插入内容,__members__
字典可能会派上用场……在一些疯狂的情况下。
[编辑]
显然 __members__
不是字典,而是地图代理。这意味着您无法轻松地向其中添加项目。
然而你可以做一些奇怪的事情,比如 MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
,然后你可以使用新的密钥,比如 MyEnum.new_key
...但这只是一个实现细节,不应该被玩弄.黑魔法需要付出巨大的维护成本。
要对任何类型的值使用枚举,试试这个:
更新了一些改进......谢谢@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')]
class enum.Enum
是一个解决你所有枚举需求的class,所以你只需要继承它,添加你自己的字段即可。然后从那时起,您需要做的就是调用它的属性: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}
根据@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']
如果只是名称,请使用 _member_names_
以获得快速简单的结果,即
Color._member_names_
此外,您还有 _member_map_
,其中 return 是元素的有序字典。此函数 return 是 collections.OrderedDict
,因此您可以使用 Color._member_map_.items()
和 Color._member_map_.values()
。例如
return list(map(lambda x: x.value, Color._member_map_.values()))
将return颜色
的所有有效值
使用 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
类 并且想要抽象 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"
给定一个基于标准的枚举 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>]
我发现处理枚举常量比处理整数更有表现力。如果枚举是从 IntEnum 继承的,那么所有枚举常量也是整数,并且可以在任何地方使用:
>>> 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]
你可以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]
只需使用:
[e.value for e in Color]
生产:
[1, 2]
要获取名称,请使用:
[e.name for e in Color]
生产:
['RED', 'BLUE']
这里有一些示例可以轻松地将 Enum 转换为 list/array 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)]
我正在使用 Enum4 库创建枚举 class,如下所示:
class Color(Enum):
RED = 1
BLUE = 2
我想在某处打印 [1, 2]
作为列表。我怎样才能做到这一点?
您可以使用 IntEnum:
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
print(int(Color.RED)) # prints 1
获取整数列表:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
您可以执行以下操作:
[e.value for e in Color]
所以 Enum
有一个 __members__
字典。
@ozgur 提出的解决方案确实是最好的,但是你可以这样做,做同样的事情,但需要更多的工作
[color.value for color_name, color in Color.__members__.items()]
如果您想在其中动态插入内容,__members__
字典可能会派上用场……在一些疯狂的情况下。
[编辑]
显然 __members__
不是字典,而是地图代理。这意味着您无法轻松地向其中添加项目。
然而你可以做一些奇怪的事情,比如 MyEnum.__dict__['_member_map_']['new_key'] = 'new_value'
,然后你可以使用新的密钥,比如 MyEnum.new_key
...但这只是一个实现细节,不应该被玩弄.黑魔法需要付出巨大的维护成本。
要对任何类型的值使用枚举,试试这个:
更新了一些改进......谢谢@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')]
class enum.Enum
是一个解决你所有枚举需求的class,所以你只需要继承它,添加你自己的字段即可。然后从那时起,您需要做的就是调用它的属性: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}
根据@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']
如果只是名称,请使用 _member_names_
以获得快速简单的结果,即
Color._member_names_
此外,您还有 _member_map_
,其中 return 是元素的有序字典。此函数 return 是 collections.OrderedDict
,因此您可以使用 Color._member_map_.items()
和 Color._member_map_.values()
。例如
return list(map(lambda x: x.value, Color._member_map_.values()))
将return颜色
的所有有效值使用 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
类 并且想要抽象 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"
给定一个基于标准的枚举 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>]
我发现处理枚举常量比处理整数更有表现力。如果枚举是从 IntEnum 继承的,那么所有枚举常量也是整数,并且可以在任何地方使用:
>>> 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]
你可以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]
只需使用:
[e.value for e in Color]
生产:
[1, 2]
要获取名称,请使用:
[e.name for e in Color]
生产:
['RED', 'BLUE']
这里有一些示例可以轻松地将 Enum 转换为 list/array 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)]