python - 比较时如何默认获取Enum值?

标签 python python-3.x enums

我创建了一个 Enum 类,如下所示:

class MsgType(Enum):
    # ADMINISTRATIVE MESSAGE
    HEARTBEAT = "0"
    LOGON = "A"
    LOGOUT = "5"
    REJECT_SESSION_LEVEL = "3"
    RESEND_REQUEST = "2"
    SEQUENCE_RESET = "4"
    SESSION_REJECT = "3"
    TEST_REQUEST = "1"

我想用这个类来比较我在阅读消息后得到的字符串。我正在比较如图所示的值。 msg_type 中的值是 str 类型。

def read_admin_msg(message):
    msg_type = read_header(message)
    if msg_type == ct.MsgType.HEARTBEAT:
        print(msg_type)
    elif msg_type == ct.MsgType.LOGON:
        print(msg_type)
    elif msg_type == ct.MsgType.LOGOUT:
        print(msg_type)
    elif msg_type == ct.MsgType.REJECT_SESSION_LEVEL:
        print(msg_type)
    elif msg_type == ct.MsgType.RESEND_REQUEST:
        print(msg_type)
    elif msg_type == ct.MsgType.SEQUENCE_RESET:
        print(msg_type)
    elif msg_type == ct.MsgType.SESSION_REJECT:
        print(msg_type)
    elif msg_type == ct.MsgType.TEST_REQUEST:
        print(msg_type)
    else:
        print("Not found")
        print(msg_type)

我的期望是对于 msg_type = "A" 语句 msg_type == ct.MsgType.LOGON 应该是 True 而不是 else 语句被执行。

如果我写 ct.MsgType.LOGON.value 然后我得到想要的结果。但我希望这种行为成为类(class)的默认行为。我应该重写哪种方法还是应该尝试不同的方法?

最佳答案

msg_type = "A" 是枚举的。您需要更改相等比较的一侧。要么:

elif msg_type == MsgType.LOGON.value:
    print(msg_type)

或者这个:

# This one is probably preferred
elif MsgType(msg_type) == MsgType.LOGON:
    print(msg_type)

编辑:我现在看到你关于使用 .value 的声明。这就是这些枚举的工作方式......如果你想覆盖 MsgType 类上的 __eq__,你可以。但是你会在这个过程中破坏 Enums 的默认相等比较,并且你必须在那里进行特殊类型检查以检查你的左侧/右侧是否是字符串/枚举/等.我只是让您的 read_header 函数返回 Enum 的一个实例,而不是字符串值。

关于python - 比较时如何默认获取Enum值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52331085/

相关文章:

java - py4j.协议(protocol).Py4JNetworkError : An error occurred while trying to connect to the Java server

python - 在 Python 中将数据集转换为奖励/错过数据集

java - 如何将 java bean 值转换为网页/演示文稿值?

angularjs - AngularJS 中枚举的最佳解决方案?

c# - 通过枚举或关系表定义数据状态

python - 将 Python 中的二进制文件读入结构

python - 导入错误: cannot import name chardet

python - 为什么这两个表在Python中不连接?

python - 如何通过循环数据框列来为每一列创建一个新的数据框?

python - 如何合并来自原始列表中两个不同列表的两个子列表