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

时间:2014-02-11 17:50:17

标签: python enums

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

有Barry的flufl.enum PEP 435说“......是这个PEP最初的参考实现”。

但是pypi上还有一个backport enum34

这些似乎都是半官方的,我应该在新代码中使用哪一个?

“应该有一种明显的方法来实现它”,但这对谷歌来说是一个难题,因为那里有数十(数百?)手动实施。而python 3.4枚举仍然只是一个候选版本。

我尝试了flufl.enum.Enumenum34.Enum,行为完全不同 - 最明显的是__getitem__的不同语义。根据Martijn Pieters的这个comment,backport很有挑战性,因为实现依赖于元类的新__prepare__函数。我已经完整地阅读了this个帖子和PEP

1 个答案:

答案 0 :(得分:10)

enum34  匹配Python3.4中的内容,以便使用它。

backport和3.4之间的一个很大区别:

  • 在Python 2中,您无法获得定义顺序(因为__prepare__尚不存在),但有一个解决方法 - 定义_order_,它将是“定义顺序” Python 2(它在Python 3中被忽略)。如果您不使用变通方法,则使用的顺序是成员的值,按升序排列。

<强>更新

  • 首选拼写现在是_order_(单个而不是双前导和尾随下划线)

  • Python3.6 +会检查_order_是否符合实际的顺序(对于保持Python 2/3代码同步很有用)


1 披露:我是Python stdlib Enum的作者,enum34 backportAdvanced Enumeration (aenum)库。