我正在使用Enum4库来创建一个枚举类,如下所示:
class Color(Enum):
RED = 1
BLUE = 2
Run Code Online (Sandbox Code Playgroud)
我想在[1, 2]某处打印列表.我怎样才能做到这一点?
ozg*_*gur 317
您可以执行以下操作:
[e.value for e in Color]
Run Code Online (Sandbox Code Playgroud)
Mar*_*cin 33
您可以使用IntEnum:
from enum import IntEnum
class Color(IntEnum):
RED = 1
BLUE = 2
print(int(Color.RED)) # prints 1
Run Code Online (Sandbox Code Playgroud)
获取整数列表:
enum_list = list(map(int, Color))
print(enum_list) # prints [1, 2]
Run Code Online (Sandbox Code Playgroud)
小智 33
只需使用:
[e.value for e in Color]
Run Code Online (Sandbox Code Playgroud)
生产:
[1, 2]
要获取名称,请使用:
[e.name for e in Color]
Run Code Online (Sandbox Code Playgroud)
生产:
['红蓝']
Eli*_*iuX 19
使用_member_names_一种快速简单的结果,如果它仅仅是个名字,即
Color._member_names_
Run Code Online (Sandbox Code Playgroud)
此外,您还拥有_member_map_返回元素的有序字典。此函数返回 a collections.OrderedDict,因此您可以使用Color._member_names_.items()和Color._member_names_.values()。例如
return list(map(lambda x: x.value, Color._member_map_.values()))
Run Code Online (Sandbox Code Playgroud)
将返回 Color 的所有有效值
Jef*_*eff 18
要使用具有任何类型值的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())
Run Code Online (Sandbox Code Playgroud)
结果:
[1, 'GREEN', ('blue', '#0000ff')]
Run Code Online (Sandbox Code Playgroud)
Mey*_*zad 18
classenum.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}
Run Code Online (Sandbox Code Playgroud)
sup*_*odo 18
你可以点个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())
Run Code Online (Sandbox Code Playgroud)
并像这样使用它:
class Roles(SuperEnum):
ADMIN = 1
USER = 2
GUEST = 3
Run Code Online (Sandbox Code Playgroud)
所以你可以:
Roles.to_dict() # {'ADMIN': 1, 'USER': 2, 'GUEST': 3}
Roles.keys() # ['ADMIN', 'USER', 'GUEST']
Roles.values() # [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
如果您使用的是 StrEnum 或 IntEnum,只需使用内置的星号表达式来解包:
from enum import IntEnum
class Color(IntEnum):
RED = 0
GREEN = 1
colors = [*Color]
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
或者如果您有多个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"
Run Code Online (Sandbox Code Playgroud)
小智 7
一种方法是获取房产的钥匙_value2member_map_:
class Color(Enum):
RED = 1
BLUE = 2
list(Color._value2member_map_.keys())
# [1, 2]
Run Code Online (Sandbox Code Playgroud)
给定一个基于标准 python3 Enum/IntEnum 类的枚举:
from enum import IntEnum
class LogLevel(IntEnum):
DEBUG = 0
INFO = 1
WARNING = 2
ERROR = 3
Run Code Online (Sandbox Code Playgroud)
可以执行以下操作来获取枚举常量列表:
>>> print(list(LogLevel))
[<LogLevel.DEBUG: 0>, <LogLevel.INFO: 1>, <LogLevel.WARNING: 2>, <LogLevel.ERROR: 3>]
Run Code Online (Sandbox Code Playgroud)
我发现使用枚举常量而不是整数更具表现力。如果枚举继承自 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'
Run Code Online (Sandbox Code Playgroud)
所以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的回答,将其重构为使用,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())
Run Code Online (Sandbox Code Playgroud)
产生:
['CREATE', 'STATUS', 'EXPAND', 'DELETE']
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
58820 次 |
| 最近记录: |