检查值是否在枚举中失败

问题描述 投票:0回答:2

我非常困惑这两者是如何工作的。有人可以帮助我理解发生了什么事以及为什么它打印“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")
python python-3.x enums
2个回答
4
投票

正如 @msanford 在评论中所说,从你的值中删除尾随的逗号——它们正在创建元组。


0
投票

为了帮助您调试它,请尝试查看

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)
© www.soinside.com 2019 - 2024. All rights reserved.