python - 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) 都可以
解决方案
您遇到的问题是:
- 在 Python 2 中,字典没有排序
- 在 Python 2 中,没有
__prepare__
元类(要记住 is 的顺序)
如果您使用的是 Python 2,则应使用aenum
库1并指定_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 stdlibEnum
、enum34
backport和Advanced Enumeration ( aenum
) 库的作者。
推荐阅读
- android - jUnit 在 androidTest 文件夹中未找到,但在 test 文件夹中找到
- javascript - 当没有请求数字数据时,为什么 AJAX 会返回 NaN?
- python - 如何在python或R中均匀地生成一组半圆内的随机点?
- android - Firebase 异步任务到协程
- python - 获取给定 ASIN 的最低 4 个价格
- c# - 从接口动态创建对象并设置值
- winforms - 使拆分容器内的面板显得突出
- xquery - 如何在 marklogic 中使用 xquery 编写内容转换?
- android - 在 Android 中检索有关自定义属性的信息
- java - 在没有键的情况下在 JSONArray 中迭代/获取 JSONObject