Python 3-比较枚举与十六进制值

时间:2019-05-07 16:21:21

标签: python python-3.x

作为python和基于hex的枚举的新手,我正在尝试将我的头缠起来。我的情况是我有一台向我发送标志的设备,并且我试图确定设置了哪些标志。我正在使用python 3.7。

我玩过Python enum(Flag)类,但似乎无法正常工作。在下面的示例中,我模拟了状态为“正在运行”和“外部电源”的响应。

from enum import Flag

class device_flags(Flag):
    RUNNING = (0x00000001)
    STOPPED = (0x00000004)
    PAUSED = (0x00000200)
    BAT_POWER = (0x01000000)
    EXT_POWER = (0x10000000)


device_status_flag = (0x10000001)  # simulate a response from device
print(device_status_flag in device_flags)

for flag in device_flags:
    print('{:15} = {}'.format(flag.name, device_status_flag in flag))

根据我所读的内容,我希望它返回true,但我得到的是假:

(run results...)

False
RUNNING         = False
STOPPED         = False
PAUSED          = False
BAT_POWER       = False
EXT_POWER       = False

有人可以解释我哪里出问题了吗?

我也收到了弃用警告

  

”在包含检查中使用非枚举将在Python中引发TypeError   3.8“

--- 我应该如何比较?

1 个答案:

答案 0 :(得分:1)

如果严格使用Flag对象,则如下所示:

def main():

    from enum import Flag

    class DeviceFlag(Flag):
        Running = 0x1
        Stopped = 0x2
        ExternalPower = 0x4

    input_status = DeviceFlag.Running | DeviceFlag.ExternalPower

    for flag in DeviceFlag:
        name = flag.name
        is_set = bool(flag & input_status)
        print(f"{name}: {is_set}")

    return 0

if __name__ == "__main__":
    from sys import exit
    exit(main())

输出:

Running: True
Stopped: False
ExternalPower: True

但是,听起来好像确实需要使用整数(十六进制值),因为您的标志来自外部设备。在这种情况下,您将不得不使用IntFlag(IntFlag继承自int,可让您将其与整数进行比较)

def main():

    from enum import IntFlag

    class DeviceFlag(IntFlag):
        Running = 0x1
        Stopped = 0x2
        ExternalPower = 0x4

    # input_status = 0x5
    input_status = 0b101

    for flag in DeviceFlag:
        name = flag.name
        is_set = bool(flag & input_status)
        print(f"{name}: {is_set}")

    return 0

if __name__ == "__main__":
    from sys import exit
    exit(main())