Python enum.Flag: лучшая практика создания «пустых» и «полных» флаговPython

Программы на Python
Anonymous
Python enum.Flag: лучшая практика создания «пустых» и «полных» флагов

Сообщение Anonymous »

Каков «лучший» (вероятнее всего, предназначенный и наименее вероятный способ устаревания/удаления) для создания пустых и полных флагов из enum.Flag?
Учитывая код:

Код: Выделить всё

from __future__ import annotations

import enum

class Color(enum.Flag, boundary=enum.STRICT):
RED = enum.auto()
GREEN = enum.auto()
BLUE = enum.auto()

@staticmethod
def black() -> Color:
return Color(0)

@staticmethod
def white() -> Color:
return Color(-1)

print(Color.black()) # Color(0)
print(Color.white()) # Color.RED|GREEN|BLUE
Являются ли Color(0) и Color(-1) лучшим способом создать пустой/полный флаг соответственно?
В документации явно используется идиома Color(0), фактически трижды. Дважды[1][2] в уведомлениях об изменении «Repr() флагов с нулевым значением» и один раз[3] в примере для оператора __bool__. Мне относительно удобно использовать это в рабочем коде, хотя я был бы признателен за более явное «благословение» из документации для этой идиомы.
Тем не менее, Color(-1) - это то, чего я, кажется, нигде не видел. Как видно из кода, он работает правильно, даже если класс enum имеет STRICT границу, определенную при его инициализации. Это «безопасно» для использования в производстве? Насколько велик риск устаревания или удаления?
Вот несколько альтернатив, которые я придумал:
  • Код: Выделить всё

    functools.reduce(operator.and_, Color)
    , для черного, аналогично оператору.or_ для белого. Я считаю, что это максимизирует «намерение библиотеки», поскольку оно использует только явно определенные операции между элементами (

    Код: Выделить всё

    __iter__
    , __and__ и __or__.)
  • Код: Выделить всё

    ~Color.black()
    для белого или наоборот, если окажется, что одна идиома «безопасна для производства», а другая — нет. (При этом используется __invert__, который явно поддерживается.)
Я ценю любые возможные рекомендации по этому вопросу!

Вернуться в «Python»