从未想过我需要这样做,但在这里我打算在python 2.7中使用枚举。
有Barry的flufl.enum PEP 435说“......是这个PEP最初的参考实现”。
但是pypi上还有一个backport enum34。
这些似乎都是半官方的,我应该在新代码中使用哪一个?
“应该有一种明显的方法来实现它”,但这对谷歌来说是一个难题,因为那里有数十(数百?)手动实施。而python 3.4枚举仍然只是一个候选版本。
我尝试了flufl.enum.Enum
和enum34.Enum
,行为完全不同 - 最明显的是__getitem__
的不同语义。根据Martijn Pieters的这个comment,backport很有挑战性,因为实现依赖于元类的新__prepare__
函数。我已经完整地阅读了this个帖子和PEP。
答案 0 :(得分:10)
backport和3.4之间的一个很大区别:
__prepare__
尚不存在),但有一个解决方法 - 定义_order_
,它将是“定义顺序” Python 2(它在Python 3中被忽略)。如果您不使用变通方法,则使用的顺序是成员的值,按升序排列。<强>更新强>
首选拼写现在是_order_
(单个而不是双前导和尾随下划线)
Python3.6 +会检查_order_
是否符合实际的顺序(对于保持Python 2/3代码同步很有用)
1 披露:我是Python stdlib Enum
的作者,enum34
backport
和Advanced Enumeration (aenum
)库。