Учитывая код:
Код: Выделить всё
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), фактически трижды. Дважды в уведомлениях об изменении «Repr() флагов с нулевым значением» и один раз в примере для оператора __bool__. Мне относительно удобно использовать это в рабочем коде, хотя я был бы признателен за более явное «благословение» из документации для этой идиомы.
Тем не менее, Color(-1) - это то, чего я, кажется, нигде не видел. Как видно из кода, он работает правильно, даже если класс enum имеет STRICT границу, определенную при его инициализации. Это «безопасно» для использования в производстве? Насколько велик риск устаревания или удаления?
Вот несколько альтернатив, которые я придумал:
- , для черного, аналогично оператору.or_ для белого. Я считаю, что это максимизирует «намерение библиотеки», поскольку оно использует только явно определенные операции между элементами (
Код: Выделить всё
functools.reduce(operator.and_, Color), __and__ и __or__.)Код: Выделить всё
__iter__ - для белого или наоборот, если окажется, что одна идиома «безопасна для производства», а другая — нет. (При этом используется __invert__, который явно поддерживается.)
Код: Выделить всё
~Color.black()