Enum с элементами Enum в Python3 - PullRequest
       18

Enum с элементами Enum в Python3

0 голосов
/ 07 февраля 2019

Я устанавливаю перечисление "A" возможных команд в моем коде Python.Я также создал бы другое перечисление "B", перечисляющее некоторые конкретные команды "A".

Таким образом я попытался:

class all_commands(IntEnum):
    SET_ELEMENT_A = 0x00000001
    GET_ELEMENT_A = 0x00000007
    GET_ELEMENT_B = 0x0000000E
    SET_ELEMENT_C = 0x00000010
    GET_ELEMENT_C = 0x00000011
    GET_ELEMENT_D = 0x00000015

class getter_commands(IntEnum):
    all_commands.GET_ELEMENT_A
    all_commands.GET_ELEMENT_B
    all_commands.GET_ELEMENT_C
    all_commands.GET_ELEMENT_D

Это мне кажется правильным, однако, когда я пытаюсь

all_commands.GET_ELEMENT_A in getter_commands

Я получаю False значение результата.

Это нормальное поведение?Или мой код неверен?

Я попытался использовать список, который работает с all_commands.GET_ELEMENT_A, но я думаю, что тип Enum будет лучше

getter_commands = [all_commands.GET_ELEMENT_A,
                all_commands.GET_ELEMENT_B,
                all_commands.GET_ELEMENT_C,
                all_commands.GET_ELEMENT_D]

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 07 февраля 2019

Enum не является решением вашей проблемы.То, что вам нужно, это что-то вроде EnumSet, который позволял бы выполнять итерации, проверки содержимого и доступ к атрибутам.Таким образом, создается нечто вроде:

getter_commands =  EnumSet(
    all_commands.GET_ELEMENT_A,
    all_commands.GET_ELEMENT_B,
    all_commands.GET_ELEMENT_C,
    all_commands.GET_ELEMENT_D,
    )

и с поведением:

>>> list(getter_commands)
[all_commands.GET_ELEMENT_A, all_commands.GET_ELEMENT_B, all_commands.GET_ELEMENT_C, all_commands.GET_ELEMENT_D]

>>> getter_commands.GET_ELEMENT_C
<all_commands.GET_ELEMENT_C: 16>

>>> all_commands.GET_ELEMENT_D in getter_commands
True

>> all_commands.SET_ELEMENT_A in getter_commands
False

Такой объект может выглядеть следующим образом:

class EnumSet:

    def __init__(self, *enum_members):
        self.__dict__.update({m._name: m for m in enum_members})

    __iter__ = self.__dict__.values
...