如何在内部跟踪 Python 枚举值?

Psy*_*nch 5 python enums python-3.x

我的最终目标实际上是在我的 Enum 类中创建一个辅助方法,该方法总是返回一个 Enum 成员并且从不引发异常,给定任何可能的值,例如

Color.from_value('red')
Run Code Online (Sandbox Code Playgroud)

如果该值不是枚举的一部分,则辅助方法将返回一个默认值,例如Color.UNKNOWN

根据另一个相关问题的答案,我可以通过一些内置成员列出这些值来检查这些值。但是,我接下来要做的是跟踪内部成员中的所有值,这样我就不必每次调用辅助方法时都遍历这些值。我尝试做类似以下的事情:

class Color(Enum):
    RED = 'red'
    BLUE = 'blue'
    GREEN = 'green'

    # this doesn't work
    _values = [item.value for item in Color]
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,它不起作用。这可能是 Python 枚举中已经内置的东西吗?

Net*_*ave 2

您可以创建方法并检查类中的值:

import enum

class Color(enum.Enum):
    RED = 'red'
    BLUE = 'blue'
    GREEN = 'green'
    UNKNOWN = "unknown"

    @classmethod
    def from_value(cls, value):
      try:
        return {item.value: item for item in cls}[value]
      except KeyError:
        return cls.UNKNOWN

print(Color.from_value("hey"))
print(Color.from_value("red"))
Run Code Online (Sandbox Code Playgroud)

结果:

Color.UNKNOWN
Color.RED
Run Code Online (Sandbox Code Playgroud)

这里有一个活生生的例子

如果您不想重申,您始终可以拥有值的外部缓存:

class Color(enum.Enum):
    RED = 'red'
    BLUE = 'blue'
    GREEN = 'green'
    UNKNOWN = "unknown"

    @classmethod
    def from_value(cls, value):
      try:
        return _COLORITEMS[value]
      except KeyError:
        return cls.UNKNOWN
_COLORITEMS = {item.value: item for item in Color}
Run Code Online (Sandbox Code Playgroud)