按定义顺序迭代python枚举

Tro*_*roy 57 python enums python-2.7

我正在使用python 3.4中的backported Enum功能和python 2.7:

> python --version
Python 2.7.6
> pip install enum34
# Installs version 1.0...
Run Code Online (Sandbox Code Playgroud)

根据python 3中的枚举文档(https://docs.python.org/3/library/enum.html#creating-an-enum),"枚举支持迭代,按定义顺序 ".但是,为了我,迭代不会发生:

>>> from enum import Enum
>>> class Shake(Enum):
...     vanilla = 7
...     chocolate = 4
...     cookies = 9
...     mint = 3
...     
>>> for s in Shake:
...     print(s)
...     
Shake.mint
Shake.chocolate
Shake.vanilla
Shake.cookies
Run Code Online (Sandbox Code Playgroud)

我是否误解了某些内容,或者是在后向版本的Enums中不支持定义顺序的迭代?假设后者,是否有一种简单的方法可以强制它按顺序发生?

Tro*_*roy 70

我在这里找到答案:https://pypi.python.org/pypi/enum34/1.0.

对于python <3.0,您需要指定__order__属性:

>>> from enum import Enum
>>> class Shake(Enum):
...     __order__ = 'vanilla chocolate cookies mint'
...     vanilla = 7
...     chocolate = 4
...     cookies = 9
...     mint = 3
...     
>>> for s in Shake:
...     print(s)
...     
Shake.vanilla
Shake.chocolate
Shake.cookies
Shake.mint
Run Code Online (Sandbox Code Playgroud)

  • 哇它们是如此有用,它们如何在Python中使向后兼容的b/w 2和3不兼容!非常酷的是,它是不可预测的.这让我们保持警惕! (10认同)
  • @neuronet:Python 2中没有“枚举”了解定义顺序所需的语言功能,这是不可避免的。 (3认同)
  • @PurpleIce 有些人维护已经开始了 10 多年的 Python 生产代码库。有些人维护的代码库必须使用未移植到 Python 2 的外部库。如果前一个版本对他们来说很好,那么他们都可以合理地优先考虑不同的事情而不是赶上最新版本的语言。对此发表严厉(坦率地说,粗鲁)的判断是无益的。 (2认同)