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 枚举中已经内置的东西吗?
您可以创建方法并检查类中的值:
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)