Python枚举.带有一个其他人使用的标志的标志



我想定义一组标志(从enum.Flag子类化(,其中一些标志是基于其他标志定义的。这类似于示例中的白旗:https://docs.python.org/3/library/enum.html#flag,但它不仅仅是以前标志的组合,还需要它自己的值。

我的第一次尝试是:

from enum import Flag, auto
class MyFlag(Flag):
NONE = 0
DEFAULT = auto()
FIRST = auto() | DEFAULT
SECOND = auto() | DEFAULT
THIRD = auto()
ANY = FIRST | SECOND | THIRD

但这引发了一个错误:TypeError: unsupported operand type(s) for |: 'auto' and 'int'

工作实施应给出:

>>> print(bool(MyFlag.FIRST & MyFlag.DEFAULT))
# prints True
>>> print(bool(MyFlag.THIRD & MyFlag.DEFAULT))
# prints False

aenum1中的auto()对象更健壮:

from aenum import Flag, auto
class MyFlag(Flag):
NONE = 0
DEFAULT = auto()
FIRST = auto() | DEFAULT
SECOND = auto() | DEFAULT
THIRD = auto()
ANY = FIRST | SECOND | THIRD

使用中:

>>> list(MyFlag)
[
<MyFlag.NONE: 0>,
<MyFlag.DEFAULT: 1>,
<MyFlag.FIRST: 3>,
<MyFlag.SECOND: 5>,
<MyFlag.THIRD: 8>,
<MyFlag.ANY: 15>,
]

1披露:我是Python stdlibEnumenum34后台端口和高级枚举(aenum(库的作者。

请注意,如果您不需要执行auto() | DEFAULT,那么其他操作可以开箱即用:

from enum import Flag, auto
class MyFlag(Flag):
NONE = 0
DEFAULT = auto()
FIRST = auto()
SECOND = auto()
THIRD = auto()
ANY = FIRST | SECOND | THIRD

我们会有

>>> [
...    MyFlag.NONE,
...    MyFlag.DEFAULT,
...    MyFlag.FIRST,
...    MyFlag.SECOND,
...    MyFlag.THIRD,
...    MyFlag.ANY,
...    MyFlag.FIRST | MyFlag.SECOND,
...    MyFlag.FIRST | MyFlag.SECOND | MyFlag.THIRD,
... ]
[<MyFlag.NONE: 0>,
<MyFlag.DEFAULT: 1>,
<MyFlag.FIRST: 2>,
<MyFlag.SECOND: 4>,
<MyFlag.THIRD: 8>,
<MyFlag.ANY: 14>,
<MyFlag.SECOND|FIRST: 6>,
<MyFlag.ANY: 14>]

这也适用于enum.IntFlag

通过定义MyFlag类的隐藏成员,可以实现以下操作。

from enum import Flag, auto
class MyFlag(Flag):
NONE = 0
DEFAULT = auto()
_FIRST = auto()
FIRST = _FIRST | DEFAULT
_SECOND = auto()
SECOND = _SECOND | DEFAULT
THIRD = auto()
ANY = FIRST | SECOND | THIRD

最新更新