我非常困惑这两者是如何工作的。有人可以帮助我理解发生了什么事以及为什么它打印“BAD”和“值不存在”?
from enum import Enum
class EventType(Enum):
USER_LOGIN = 1,
USER_LOGOUT = 2,
@classmethod
def has_value(cls, value):
return value in cls._value2member_map_
eventType = 2
if not EventType.has_value(eventType):
print("BAD")
else:
print("GOOD")
if eventType in EventType.__members__.values():
print("Value exists")
else:
print("Value does not exist")
正如 @msanford 在评论中所说,从你的值中删除尾随的逗号——它们正在创建元组。
为了帮助您调试它,请尝试查看
cls._value2member_map_
的实际外观。
@classmethod
def has_value(cls, value):
print(cls._value2member_map_)
return value in cls._value2member_map_
在我的 python3.12 安装中,我得到以下输出:
{(1,): <EventType.USER_LOGIN: (1,)>, (2,): <EventType.USER_LOGOUT: (2,)>}
这有助于解释它——枚举常量在内部存储为元组(我没有明白为什么——看起来评论部分抓住了它)
如果可以,我建议将基类更改为
IntEnum
并利用此 in
语法来使用 记录的技术 来测试成员资格,如下所示:
from enum import IntEnum
class EventType(IntEnum):
USER_LOGIN = 1
USER_LOGOUT = 2
print(2 in EventType)
print(3 in EventType)