python2.7 中最少的非官方枚举支持 - flufl.enum 或 enum34



从没想过我需要这样做,但在这里我打算在python 2.7中使用枚举。

有巴里的 flufl.enum,PEP 435 说"......是本 PEP 最初所基于的参考实施"。

但是pypi上也有一个向后移植的enum34。

这两个看起来都是半官方的,那么我应该在新代码中使用哪一个呢?

"应该有一种明显的方法来做到这一点",但这是一个很难谷歌的话题,因为那里有几十(数百个?)手工卷的实现。 而python 3.4枚举仍然只是一个候选版本。

我已经尝试了flufl.enum.Enumenum34.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) 库。

最新更新