【问题标题】:Least unofficial enum support in python2.7 - flufl.enum or enum34?python2.7中最少的非官方​​枚举支持-flufl.enum还是enum34?
【发布时间】:2014-02-11 17:50:16
【问题描述】:

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

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

但在 pypi 上也有一个反向移植 enum34。

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

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

我已经尝试过flufl.enum.Enum 和enum34.Enum,它们的行为完全不同——最明显的是__getitem__ 的不同语义。根据 Martijn Pieters 的 comment,反向移植具有挑战性,因为实现依赖于元类上的新 __prepare__ 函数。我已经完整阅读了this 帖子和PEP。

【问题讨论】:

标签: python python-2.7 enums


【解决方案1】:

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 backport 的作者 ,以及Advanced Enumeration (aenum) 库。

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 2022-07-08
    • 2021-01-16
    相关资源
    最近更新 更多