Я знаю базовые классы Enum
и IntEnum
. Оба очень полезны, но я пропускаю функции для операций с флагом. Я не ожидаю, что эти два класса реализуют мою желаемую функцию.
Возьмем пример:
class NetlistKind(IntEnum):
Unknown = 0
LatticeNetlist = 1
QuartusNetlist = 2
XSTNetlist = 4
CoreGenNetlist = 8
All = 15
Как вы можете видеть, я уже использую IntEnum
для получения арифметических функций для этого перечисления. Было бы неплохо иметь что-то вроде @unique
чтобы обеспечить, чтобы все ценности были силой двух. Я могу сделать это, нарисуя enum.unique для моих нужд. (Я знаю, что All
является исключением из этого правила.)
Как такое перечисление используется?
filter = NetlistKind.LatticeNetlist | NetlistKind.QuartusNetlist
Благодаря подстилающим операциям int бит возможны и фильтр имеет внутреннее значение 3.
Если было бы неплохо иметь функцию "flag X set in filter Y" или даже лучше оператора. Я добавляю магическую функцию для x in y
:
@unique
class NetlistKind(IntEnum):
Unknown = 0
LatticeNetlist = 1
QuartusNetlist = 2
XSTNetlist = 4
CoreGenNetlist = 8
All = 15
def __contains__(self, item):
return (self.value & item.value) == item.value
Пример использования:
....
def GetNetlists(self, filter=NetlistKind.All):
for entity in self._entities:
for nl in entity.GetNetlists():
if (nl.kind in filter):
yield nl
def GetXilinxNetlists(self):
return self.GetNetlists(NetlistKind.XSTNetlist | NetlistKind.CoreGenNetlist)
Поэтому вопросы:
- Есть ли лучшие способы реализации битовых полей?
- Есть ли лучшие способы реализации такого одномерного фильтра? Я не хочу использовать lamdas для такого простого условия фильтрации?
- Является ли такое решение уже включенным в стандартную библиотеку Python?
- Как добавить это расширение перечисления в следующую версию Python? :)
Открытые функции:
- возвращает список всех активных флагов в
__str__
- ...?