从没想过我需要这样做,但在这里我打算在python 2.7中使用枚举。
有巴里的 flufl.enum,PEP 435 说"......是本 PEP 最初所基于的参考实施"。
但是pypi上也有一个向后移植的enum34。
这两个看起来都是半官方的,那么我应该在新代码中使用哪一个呢?
"应该有一种明显的方法来做到这一点",但这是一个很难谷歌的话题,因为那里有几十(数百个?)手工卷的实现。 而python 3.4枚举仍然只是一个候选版本。
我已经尝试了flufl.enum.Enum
和enum34.Enum
,行为完全不同 - 最明显的是__getitem__
的不同语义。 根据 Martijn Pieters 的这一评论,向后移植具有挑战性,因为实现依赖于元类上的新__prepare__
函数。 我已经完整地阅读了这篇文章和 PEP。
enum34
匹配 Python3.4 中的内容,因此这是要使用的那个。
向后移植和3.4之间的一个很大区别:
- 在 Python 2 中,您无法获得定义顺序(
- 因为
__prepare__
还不存在),但有一个解决方法 - 定义_order_
,它将是 Python 2 中的"定义顺序"(在 Python 3 中被忽略)。 如果不使用解决方法,则使用的顺序是成员的值,按递增顺序排列。
更新
-
首选拼写现在为
_order_
(单前导和尾随下划线而不是双前导和尾随下划线) -
Python3.6+ 将检查
_order_
是否与实际顺序匹配(对于保持 Python 2/3 代码同步很有用)
1 披露:我是 Python stdlib Enum
的作者,enum34
向后移植和高级枚举 (aenum
) 库。