Python enum.Flag с одним флагом, который используется некоторыми другими - PullRequest
0 голосов
/ 11 марта 2020

Я хотел бы определить набор флагов (подкласс из 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

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Объект auto() в aenum 1 гораздо надежнее:

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 stdlib Enum, enum34 backport и Advanced Enumeration (aenum) библиотека.

0 голосов
/ 11 марта 2020

Следующие работы, определяя скрытого члена класса 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
...