2016-08-01 6 views
2

Мне нравится Enum много, и я хотел бы сделать следующее:альтернативе для питона Enum с повторяющимися значениями

class Color(Enum): 
    green = 0 
    red = 1 
    blue = 1 

for color in Color: 
    print(color.name) 
    print(color.value) 

Как вы можете видеть, есть повторяющиеся значения в Color классе. Какую альтернативу класса я могу использовать в этом случае, которая поддерживает итерабельность, имя, значение?

+0

Взгляните на: http://stackoverflow.com/a/1695250/5399734 и другие приятные ответы по этому вопросу. –

ответ

1

Вы спрашиваете, как вы можете иметь Color.redиColor.blue без blue быть псевдонимом red?

Если да, то вы хотите использовать библиотеку aenum и это будет выглядеть примерно так:

from aenum import Enum, NoAlias 

# python 3 
class Color(Enum, settings=NoAlias): 
    green = 0 
    red = 1 
    blue = 1 

# python 2 
class Color(Enum): 
    _order_ = 'green rud blue' 
    _settings_ = NoAlias 
    green = 0 
    red = 1 
    blue = 1 

И в использовании:

for color in Color: 
    print(color.name) 
    print(color.value) 

# green 
# 0 
# red 
# 1 
# blue 
# 1 

Недостатком использования NoAlias является по-значение поиска отключены (вы не можете сделать Color(1)).


Раскрытие: Я автор Python stdlib Enum, то enum34 backport и Advanced Enumeration (aenum) библиотека.

+0

Awesome!, Я использовал Enum встроенный «enum», но не знал, что существует Enum из «aenum» с настройкой NoAlias. Спасибо! – user1502776

+0

@ user1502776: Если вам не нужны другие «Enum' goodies (итерация через класс, длина класса и т. Д.), Вы можете использовать класс« NamedConstant »из« aenum ». –