Для получения более продвинутых методов перечисления попробуйте библиотеку aenum (2.7, 3.3+, тот же автор, что и enum34. Код не совсем совместим между py2 и py3, например, вам понадобится __order__ в python 2).
Чтобы использовать enum34, выполните $ pip install enum34
Чтобы использовать aenum, выполните $ pip install aenum
Установка enum (без цифр) установит совершенно другую и несовместимую версию.
from enum import Enum # for enum34, or the stdlib version # from aenum import Enum # for the aenum version Animal = Enum('Animal', 'ant bee cat dog')
Поддержка преобразования значений обратно в имена может быть добавлена таким образом:
defenum(*sequential, **named): enums = dict(zip(sequential, range(len(sequential))), **named) reverse = dict((value, key) for key, value in enums.iteritems()) enums['reverse_mapping'] = reverse returntype('Enum', (), enums)
Это перезаписывает все, что имеет это имя, но это полезно для отображения ваших перечислений в выходных данных. Это выдаст KeyError если обратного отображения не существует. В первом примере:
>>> Numbers.reverse_mapping['three'] 'THREE'
Если вы используете MyPy, другой способ выразить "перечисления" - с помощью typing.Literal.
Например:
from typing importLiteral#python >=3.8 from typing_extensions importLiteral#python 2.7, 3.4-3.7
До PEP 435 в Python не было эквивалента, но вы могли реализовать свой собственный.
Лично мне нравится, когда все просто (я видел несколько ужасно сложных примеров в сети), что-то вроде этого ...
classAnimal: DOG = 1 CAT = 2
x = Animal.DOG
В Python 3.4 (PEP 435) вы можете сделать Enum базовым классом. Это дает вам немного дополнительной функциональности, описанной в PEP . Например, элементы enum отличаются от целых чисел и состоят из name и a value.
from enum import Enum
classAnimal(Enum): DOG = 1 CAT = 2
print(Animal.DOG) # <Animal.DOG: 1>
print(Animal.DOG.value) # 1
print(Animal.DOG.name) # "DOG"
Если вы не хотите вводить значения, используйте следующий ярлык:
classEnum(set): def__getattr__(self, name): if name in self: return name raise AttributeError
Вот его использование:
Animals = Enum(["DOG", "CAT", "HORSE"])
print(Animals.DOG)
Ответ 4
Если вам нужны числовые значения, вот самый быстрый способ:
dog, cat, rabbit = range(3)
В Python 3.x вы также можете добавить отмеченный звездочкой заполнитель в конце, который впитает все оставшиеся значения диапазона на случай, если вы не возражаете тратить память впустую и не можете считать: