Итерация Python Enum в порядке определения

Я использую перенесенную функциональность Enum из python 3.4 с python 2.7:

> python --version
Python 2.7.6
> pip install enum34
# Installs version 1.0...

Согласно документации для Enums в python 3 ( https://docs.python.org/3/library/enum.html), "Перечисления поддерживают итерации в порядке определения". Тем не менее, итерация не происходит для меня:

>>> 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

Я что-то неправильно понимаю, или итерация в порядке определения просто еще не поддерживается в версиях Enums с бэкпортом? Если предположить последнее, есть ли простой способ заставить это произойти по порядку?

2 ответа

Решение

Я нашел ответ здесь: 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

использовать

      __order__ 

чтобы определить порядок перечислений для версии Python меньше 3 . В python3 это не обязательно, но убедитесь, что указанный порядок совпадает с объявленным порядком, иначе он выдаст ошибку:

      TypeError: member order does not match _order_


import enum


class EXCHANGE(enum.Enum):
    __order__ = " EXCHANGE_NSE EXCHANGE_BSE EXCHANGE_NFO EXCHANGE_CDS EXCHANGE_BFO EXCHANGE_MCX EXCHANGE_BCD "
    EXCHANGE_NSE = "NSE"
    EXCHANGE_BSE = "BSE"
    EXCHANGE_NFO = "NFO"
    EXCHANGE_CDS = "CDS"
    EXCHANGE_BFO = "BFO"
    EXCHANGE_MCX = "MCX"
    EXCHANGE_BCD = "BCD"


if __name__ == "__main__":
    for ex in EXCHANGE:
        print(f"{ex.name} : {ex.value}")

Выход:

      EXCHANGE_NSE : NSE
EXCHANGE_BSE : BSE
EXCHANGE_NFO : NFO
EXCHANGE_CDS : CDS
EXCHANGE_BFO : BFO
EXCHANGE_MCX : MCX
EXCHANGE_BCD : BCD
Другие вопросы по тегам