假设我有以下标志枚举:
class MyFlags(Flag):
FLAG0 = 0x01
FLAG1 = 0x02
#INVALID = 0x04
FLAG3 = 0x08
#INVALID = 0x10
#INVALID = 0x20
#INVALID = 0x40
INVALID = 0x80
我想从 int 创建 MyFlags 的实例,这样,如果 int 由 MyFlags 中未定义的 2 的幂组成,则返回 MyFlags.INVALID 。换句话说:
>>> Flags(0x01), Flags(0x03), Flags(0x04), Flags(0x85)
(<MyFlags.FLAG0: 1>, <MyFlags.FLAG0|FLAG1: 3>, <MyFlags.INVALID: 128>,<MyFlags.FLAG0|INVALID>: 129)
因此,如果解码了无效标志,则很容易识别,即:
>>> rx_byte = 0x081
>>> MyFlags.INVALID in MyFlags(rx_byte)
True
如果
MyFlags(x)
失败,则会引发 ValueError
;抓住那个。
try:
x = MyFlags(15)
except ValueError:
x = ...