首页 > 解决方案 > python2中的枚举自动

问题描述

我读过在 python 3 中使用 Enums 时,您可以选择使用 auto 自动枚举元素。似乎在 python2 中这是不可能的。

但是我发现这个文档允许自动编号。但是它运行不正常

在我们拥有的文档中

class AutoNumber(Enum):
    def __new__(cls):
        value = len(cls.__members__) + 1
        obj = object.__new__(cls)
        obj._value_ = value
        return obj

class Color(AutoNumber):
    red = ()
    green = ()
    blue = ()

然后在他们给我们的文档中作为例子

Color.green.value == 2

是的,绿色给我们 2。但红色给我们 3!蓝色给我们1

所以元素的值是 3,2,1 而不是我假设的 0,1,2 或 1,2,3。

我试图修改自动编号但没有成功。

我怎样才能得到正确的编号?(0,1,2) (1,2,3) 或 (-1,0,1) 都可以

标签: pythonpython-2.7enums

解决方案


您遇到的问题是:

  • 在 Python 2 中,字典没有排序
  • 在 Python 2 中,没有__prepare__元类(要记住 is 的顺序)

如果您使用的是 Python 2,则应使用aenum1并指定_order_属性,如下所示:

from aenum import Enum, auto

class Color(Enum):
    _order_ = 'red green blue'
    red = auto()
    green = auto()
    blue = auto()

如果你有很多名字,你也可以使用函数式 API 形式:

Color = Enum('Color', """
    red
    green
    blue
    magenta
    white
    """)

名称只需用空格分隔,它们的值将从1.

--

1披露:我是Python stdlibEnumenum34backportAdvanced Enumeration ( aenum) 库的作者。


推荐阅读