初始化python标志实用程序类的最佳方法?

问题描述 投票:1回答:1

我正在使用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

但是我无法强制执行,并且可能希望将其与其他人的代码一起使用。


  1. 是否有Pythonic方法来做到这一点?
  2. 模块函数会更好:flags = set(flags,Flag.A)?
  3. 有没有更好的方法来进行合并方法而不从functools导入reduce?
  4. 或者最好不使用*标志并强制显式flags.set(Flag.A | Flag.B)而不是flags.set(Flag.A,Flag.B)?
python-3.x enums flags enum-flags
1个回答
1
投票

你可以将它设置为0,即使没有FlagIntFlag,因为它表示没有设置标志的状态:

>>> @unique
... class Flag(eFlag):
...     A = auto()
...     B = auto()
... 

>>> Flag.A & Flag.B
<Flag.0: 0>

>>> Flag(0)
<Flag.0: 0>
© www.soinside.com 2019 - 2024. All rights reserved.