我正在使用Python3.7中的实用程序类,这使得使用标记更加用户友好(对我来说,至少)
基本上,我想转此
from enum import Flag as eFlag, auto, unique
@unique
class Flag(eFlag):
A = auto()
B = auto()
flags = Flag.A
flags |= Flag.B
if flags & Flag.B:
pass
进入这个:
flags = Flags()
flags.set(Flag.A, Flag.B)
if flags.is_set(Flag.A):
pass
为此,我有一个像这样的Flags类:
class Flags:
def set(self, *flags):
self.raw |= self.merge(*flags)
def clear(self, *flags):
self.raw &= ~self.merge(*flags)
def is_set(self, *flags):
return bool(self.raw & self.merge(*flags))
@classmethod
def merge(cls, *flags):
F = None
for f in flags:
F |= f
return F
def __str__(self):
return str(self.raw)
问题是在init方法中初始化raw属性。我知道我可以将它设置为0,但是然后Flag的基数必须是enum.IntFlag,我想保持它作为enum.Flag按照docs。合并方法中存在同样的问题,因为我有F = None,然后尝试用标志对它进行OR运算。
如果Flag枚举保证具有NONE = 0属性,我可以在Flags类中执行类似的操作:
def __init__(self, FlagCls):
self.raw = FlagCls.NONE
但是我无法强制执行,并且可能希望将其与其他人的代码一起使用。
你可以将它设置为0
,即使没有Flag
是IntFlag
,因为它表示没有设置标志的状态:
>>> @unique
... class Flag(eFlag):
... A = auto()
... B = auto()
...
>>> Flag.A & Flag.B
<Flag.0: 0>
>>> Flag(0)
<Flag.0: 0>