【问题标题】:Enum with Enum elements in Python3Python3中带有枚举元素的枚举
【发布时间】:2019-02-07 10:48:04
【问题描述】:

我在我的 Python 代码中设置了一个枚举“A”的可能命令。 我还将创建另一个枚举“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]

感谢您的帮助!

【问题讨论】:

  • all_commands.GET_ELEMENT_A 访问属性,它不会将其保存到getter_commands 类字段
  • 所以没有办法使用第二个Enum 引用第一个,对吧?
  • 如果你想在getter_commands枚举中有一个成员GET_ELEMENT_A,你可以做GET_ELEMENT_A = all_commands.GET_ELEMENT_A

标签: python-3.x list enums


【解决方案1】:

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

【讨论】:

  • 谢谢你,应该可以完成这项工作!
  • @Ulysse:不客气!当您发现有帮助的答案时,记得给他们投票(点击答案标题旁边的向上箭头);另外,您应该选择最有帮助或最喜欢的答案,然后单击它旁边的复选标记。这有助于其他人寻找相同问题的答案。
猜你喜欢
  • 2012-01-13
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2015-08-08
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多