Предположим, у меня есть класс, расширяющий Enum, с именем foo; Однако вместо использования целых чисел для каждого элемента я использую строки
from enum import Enum
class foo (Enum):
foo = "Hello"
bar = ", "
foobar = "world"
barfoo = "!"
При компиляции система не выдаст ошибок и с радостью обработает этот класс как обычное перечисление. В зависимости от того, зачем кому-то это нужно, это очень полезно, если вы хотите связать каждое имя со структурой данных, например dict. Возьмем, к примеру, следующее:
from enum import Enum
class foo (Enum):
foo = {"text" : "Hello", "meaning" : "hello"}
bar = {"text" : ", ", "meaning" : "comma"}
foobar = {"text" : "world", "meaning" : "world"}
barfoo = {"text" : "!", "meaning" : "exclamation"}
Ну, лабиринт, почему бы тогда просто не использовать обычный класс?
Что ж, очень полезно иметь возможность хранить эту информацию в виде перечисления для быстрого сравнения типов. Например, x = {"name" : "foo", "type" : foo.foo} можно легко проверить на тип с помощью if x[type] is foo.foo.
Это «плохая практика»? Под этим я имею в виду:
Enum?(Enum) из class foo (Enum):, будет ли разница в эффективности при сравнении?





Нет, это неплохая практика.
Да, Enum был разработан для работы с нецелочисленными типами.
Версия без Enum, вероятно, будет быстрее, но это, вероятно, не имеет значения. (Проверьте узкие места, прежде чем угадывать, что нужно оптимизировать.)
Использование изменяемых типов разрешено - это означает, что я не предпринял никаких шагов, чтобы запретить это 1, - но, как правило, это не очень хорошая идея. Члены Enum должны быть постоянными. Ваш пример выглядит так, как будто вы хотите иметь два дополнительных атрибута для каждого члена: text и meaning - это возможно как в версии Enum stdlib, так и в версии Advanced EnumerationEnum:
from aenum import AutoNumberEnum
class Foo(AutoNumberEnum):
_init_ = 'text meaning'
foo = "Hello", "hello"
bar = ", ", "comma"
foobar = "world", "world"
barfoo = "!", "exclamation"
и в использовании:
>>> Foo.bar
<Foo.bar: 2>
>>> Foo.bar.text
', '
>>> Foo.bar.meaning
'comma'
См. этот ответ, чтобы узнать, как это сделать с помощью stdlib.
1 Раскрытие: я являюсь автором библиотек Python stdlib Enum, enum34 задний порт и Расширенное перечисление (aenum).
Этот парень enums
Ого, AutoNumberEnum в значительной степени именно то, что я хочу. Спасибо!
Я бы опасался изменять значения.