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

标签 python python-3.x enums

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

Color.from_value('red')

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

基于此answer from another related question ,我可以通过一些内置成员列出它们来检查值。但是,我接下来要做的是跟踪内部成员中的所有值,这样我就不必在每次调用辅助方法时都遍历这些值。我尝试做类似以下的事情:

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

    # this doesn't work
    _values = [item.value for item in Color]

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

最佳答案

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

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"))

结果:

Color.UNKNOWN
Color.RED

这里有一个 live example

如果你不想重申,你总是可以有值的外部缓存:

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}

关于python - 我如何在内部跟踪 Python 枚举值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53041173/

相关文章:

mysql - 为什么 MySQL 对 ENUM 值加 1?

python-3.x - 魔杖策略错误 : error/constitute. c/ReadImage/412

python - 嵌套循环以确定两个类(class)的学生(两个)

python - retrbinary 中的 FTPlib 错误

c# - 将字符串值分配给枚举,然后按值查找枚举

python - 具有超过 32 个维度的 numpy ndarray

python - 使用python在文件中插入一行

python - 无法编辑 django 表

python - 找出字符串编码的聪明方法?

javascript - 导出目录中的所有接口(interface)以获得更好的导入语句/自动填充