有关如何在Python中实现枚举的一些问题.大多数解决方案最终或多或少等同于以下内容:
class Animal:
DOG=1
CAT=2
Run Code Online (Sandbox Code Playgroud)
其他人已经提出了构建枚举的更复杂的方法,但最终看起来和完成时往往看起来像这个例子.
根据我在Java和C#的经验,我可以想到这种习语的各种用法.但是,它似乎不是非常Pythonic.实际上,似乎每次有人问为什么Python中没有枚举时,你会倾向于对如何没有理由尝试在Python这样的语言中强制编译时类型安全的罐装响应有点呻吟,或者如何在Python中使用枚举的设计是难闻的气味.
我的问题不是如何在Python中实现枚举,而是一般人们如何处理以Pythonic方式使用枚举的问题的解决方案.换句话说,如果不将Java/C#解决方案移植到Python,您将如何解决一个问题,该问题适用于具有一组离散可能值的数据类型.
PEP 435刚刚被接受,它将 enum 包与 Enum 类和其他衍生物(如 IntEnum)一起添加到标准库中。这意味着从 Python 3.4 开始,在设计中使用枚举的“Pythonic”方式就是使用此包。它看起来像这样:
>>> from enum import Enum
>>> class Color(Enum):
... red = 1
... green = 2
... blue = 3
>>> print(Color.red)
Color.red
>>> print(Color.red.name)
red
>>>> for color in Color:
.... print(color)
Color.red
Color.green
Color.blue
Run Code Online (Sandbox Code Playgroud)
这种设计的关键特征是键可以拒绝没有意义的比较(与其他答案中建议的字符串键不同),允许键具有与键值无关的漂亮打印,以及赋予键值特殊除了在用户尝试使用 Enum 类中的非法键时抛出显式且可理解的错误的属性之外,还可以通过在 Enum 子类上定义方法来实现这些属性。