在python中使用具有非整数类型的枚举是一种不好的做法吗?

时间:2018-07-07 18:08:32

标签: python python-3.x enums

假设我有一个扩展了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的类型。

这是“不良做法”吗?我的意思是:

  1. 这是Enum的预期用途吗?
  2. 如果我从(Enum)中抽出class foo (Enum):,比较时效率会有所不同吗?
  3. 是否有更好的方法来做我想做的事?

1 个答案:

答案 0 :(得分:3)

  • 在python中使用具有非整数类型的枚举是否是错误的做法?

不,这不是坏习惯。

  • 这是否是Enum的预定用途

是的,Enum设计为可用于非整数类型。

  • 如果我从foo(Enum)类中取出(Enum):,比较时会有效率差异吗?

Enum版本可能会更快,但这可能无关紧要。 (在猜测需要优化之前先进行瓶颈测试。)

  • 是否有更好的方法来做我想做的事?

允许使用可变类型-意味着我没有采取任何措施禁止它 1 -但这通常不是一个好主意。 Enum个成员应保持不变。您的示例看起来像您想在每个成员上具有两个额外的属性:textmeaning-在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 Enumenum34 backportAdvanced Enumeration (aenum)库的作者。