有几个关于如何在 Python 中实现枚举的问题。大多数解决方案最终或多或少等同于以下内容:
class Animal:
DOG=1
CAT=2
其他人提出了更复杂的构造枚举的方法,但归根结底,最终看起来像这个例子。
根据我在 Java 和 C# 方面的经验,我可以想到这种习语的各种用途。但是,它似乎不是很 Pythonic。事实上,似乎每次有人问为什么 Python 中没有枚举时,你往往会得到一些关于如何没有理由在像 Python 这样的语言中尝试和强制执行编译时类型安全的固定回答的提示,或者需要枚举的设计如何在 Python 中产生难闻的气味。
我的问题不是如何在 Python 中实现枚举,而是人们通常如何以 Pythonic 方式解决适合枚举的问题。换句话说,如果不将 Java/C# 解决方案移植到 Python,您将如何解决一个数据类型具有一组离散可能值的问题。
最佳答案
PEP 435刚刚被接受,它将枚举包与枚举类和其他派生类(如 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
这个设计的关键特征是键可以拒绝没有意义的比较(不像其他答案中建议的字符串键),允许键具有与键值无关的 pretty-print ,以及给出key 通过在 Enum 子类上定义方法来赋予特殊属性值,此外还有在用户尝试使用 Enum 类中的非法 key 时抛出明确且可理解的错误的属性。
关于没有枚举的 Pythonic 设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12810974/