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

标签 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. 有没有更好的方法来完成我想做的事情?

最佳答案

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

不,这不是坏习惯。

  • 这是 Enum 的预期用途吗

是的,Enum 设计用于处理非整数类型。

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

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

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

允许使用可变类型——这意味着我没有采取任何措施来禁止它1——但这通常不是一个好主意。 Enum 成员应该是常量。你的例子看起来你想在每个成员上有两个额外的属性:textmeaning - 这在 Enum 的 stdlib 版本上都是可能的>,以及 Advanced Enumeration 枚举的版本:

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'

参见 this answer用于实现此目的的 stdlib 方法。


1 披露:我是 Python stdlib Enum 的作者, enum34 backport , 和 Advanced Enumeration (aenum)图书馆。

关于python - 在 python 中使用具有非整数类型的枚举是一种不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51225769/

相关文章:

python - 大数的模幂

python-3.x - 如何在 tensorflow 2.0b 中检查/释放 GPU 内存?

c++ - 为嵌套枚举类声明友元插入运算符(运算符<<)

java - 为什么会出现 java.lang.NoSuchFieldError : on an Enum value?

python - pymssql连接不返回数据,只打印列名?

python - 如何在Python代码中拥有cfile

Python 脚本在 IDLE 中执行时有效,但在控制台中无效

algorithm - n Queen backtracking 迭代所有位置

rust - 如何以小写形式显示枚举?

python - 在什么情况下我会使用元组作为字典键?