Python - 用于比较时默认获取枚举的值

ap1*_*p14 5 python enums python-3.x

我创建了一个 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"
Run Code Online (Sandbox Code Playgroud)

我想使用这个类与我在阅读消息后得到的字符串进行比较。我正在比较如图所示的值。中的值msg_type是 a 类型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)
Run Code Online (Sandbox Code Playgroud)

我希望,因为msg_type = "A"语句msg_type == ct.MsgType.LOGON应该是Trueelse语句被执行。

如果我写,ct.MsgType.LOGON.value那么我会得到想要的结果。但我希望这种行为成为班级的默认行为。我应该覆盖哪种方法还是应该尝试不同的方法?

who*_*ski 6

msg_type = "A"是枚举的值。您需要改变平等比较的一侧。任何一个:

elif msg_type == MsgType.LOGON.value:
    print(msg_type)
Run Code Online (Sandbox Code Playgroud)

或这个:

# This one is probably preferred
elif MsgType(msg_type) == MsgType.LOGON:
    print(msg_type)
Run Code Online (Sandbox Code Playgroud)

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

  • 在第二种情况下,可能最好在获取值时执行此操作:“msg_type = ct.MsgType(read_header(message))”。 (2认同)