没有枚举的 Pythonic 设计

标签 python enums

有几个关于如何在 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/

相关文章:

c++ - 枚举不返回值

c# - 将 [Display(Name = "X")] 与枚举一起使用。 MVC3 ASP.Net 中的自定义 HtmlHelper

c# - C#更改枚举中的项目的int值

python - 在Python中转换多维数组维度

python - 如何在 Python 中查找光标的行号?

python - Python 中的 CURL 替代方案

java - 如何比较 XML 枚举和 Java 枚举?

python - 哪一种是在 Django 模型中使用 Python 类型提示的正确方法?

python - 根据列中的值重复行 x 次

c# - 当它是泛型时是否可以转换为枚举?