假设我有一个扩展了Enum
的类,名为foo;但是,我没有使用整数,而是使用字符串
from enum import Enum
class foo (Enum):
foo = "Hello"
bar = ", "
foobar = "world"
barfoo = "!"
编译时,系统不会抛出任何错误,并且会愉快地将此类视为普通枚举。根据为什么有人想要这样做,如果您想链接每个名称,这将非常有用数据结构,如字典。以此为例:
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):
,比较时效率会有所不同吗?答案 0 :(得分:3)
不,这不是坏习惯。
是的,Enum
设计为可用于非整数类型。
非Enum
版本可能会更快,但这可能无关紧要。 (在猜测需要优化之前先进行瓶颈测试。)
允许使用可变类型-意味着我没有采取任何措施禁止它 1 -但这通常不是一个好主意。 Enum
个成员应保持不变。您的示例看起来像您想在每个成员上具有两个额外的属性:text
和meaning
-在Enum
的stdlib版本和Advanced Enumeration
的stdlib版本中都可以实现Enum
的版本:
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方法,请参见this answer。
1 披露:我是Python stdlib Enum
,enum34
backport和Advanced Enumeration (aenum
)库的作者。