作为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“
--- 我应该如何比较?
答案 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())