首页 > 解决方案 > Python enum.Flag 带有一个被其他人使用的标志

问题描述

我想定义一组标志(从 子类化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

标签: pythonenumsenum-flags

解决方案


1中的auto()对象更加健壮:aenum

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 stdlibEnumenum34backportAdvanced Enumeration ( aenum) 库的作者。


推荐阅读