В Python3 это просто работаетПочему порядок определения не доступен в python2?
>>> from enum import Enum
>>> class Animal(Enum):
... cat = [0]
... dog = {1}
Но питона v2.7.6 это поднимает TypeError
, потому что необработанное исключение, когда Метакласс базы попытаться вызвать отсортирован по значениям.
Мы можем исправить это следующим образом:
>>> class Animal(Enum):
... __order__ = 'cat dog'
... cat = [0]
... dog = {1}
Мой вопрос: почему порядок определения недоступен в python2? Я предполагаю, что поэтому версия python2 не работает, исправьте меня, если я ошибаюсь.
Если мы делаем это перечисление, как это:
>>> class Animal(Enum):
... cat = {0, 1}
... dog = {1, 2}
... fish = {2, 0}
Будет упорядоченность безопасным и хорошо определены? Или это будет ненадежным, например dict
или set
Итерация?
редактировать: с TRACEBACK
In [1]: from enum import Enum
In [2]: class Animal(Enum):
dog = [0]
cat = {1}
...:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-d14b1041d5bc> in <module>()
----> 1 class Animal(Enum):
2 dog = [0]
3 cat = {1}
4
/usr/local/lib/python2.7/dist-packages/enum/__init__.pyc in __new__(metacls, cls, bases, classdict)
164 if __order__ is None:
165 if pyver < 3.0:
--> 166 __order__ = [name for (name, value) in sorted(members.items(), key=lambda item: item[1])]
167 else:
168 __order__ = classdict._member_names
TypeError: Error when calling the metaclass bases
can only compare to a set
Какую версию 'enum' вы используете с Python 2? Пакет '' enum34' backport package (https://pypi.python.org/pypi/enum34/) не вызывает 'TypeError' в вашем первом примере. Здесь что-то не хватает? –
Это как раз enum34 backport, версия 'enum34 == 1.0' в соответствии с замораживанием пипетки. И да, это поднимает исключение на python 2.7.6, вы говорите, что у вас нет ?! – wim
Возможно, вы используете другую реализацию Martijn .. – wim