什么';python中枚举的一个很好的用例是什么?

什么';python中枚举的一个很好的用例是什么?,python,enums,Python,Enums,我已经写了3年Python 2代码了,虽然我知道Enum很长时间了,但我们已经开始在我们的项目中使用它们(backported-pypi包enum34) 我想知道什么时候使用它们 我们开始使用它们的一个地方是将一些postgres数据库级枚举映射到python枚举。因此我们有了这个枚举类 class Status(enum.Enum): active = 'active' inactive = 'inactive' 但当我们使用这些时,我们最终会这样使用它们: if value

我已经写了3年Python 2代码了,虽然我知道Enum很长时间了,但我们已经开始在我们的项目中使用它们(backported-pypi包enum34)

我想知道什么时候使用它们

我们开始使用它们的一个地方是将一些postgres数据库级枚举映射到python枚举。因此我们有了这个枚举类

class Status(enum.Enum):
    active = 'active'
    inactive = 'inactive'
但当我们使用这些时,我们最终会这样使用它们:

if value == Status.active.value:
    ...
因此,在这种情况下,使用enum不如只使用更简单的类(如下面所示)有用

class Status(object):
    active = 'active'
    inactive = 'inactive'
因为我们可以更容易地使用它,比如
value==Status.active

到目前为止,我发现这个方法唯一有用的地方——虽然没有我想的那么有用——是在docstring中。与其显式地说允许的值是“active”和“inactive”,我只需声明我的形式参数接受状态枚举的一个成员(当存在更多状态时更有用)

所以我真的不知道它们的确切用例是什么——我不知道它们如何比字符串常量更好

简而言之:何时使用枚举?

几点:

  • 您的
    Enum
    类可以使用
    str
    作为mixin
  • 某些数据库层允许将存储的数据转换为Python数据类型
关于第一点:

class Status(str, Enum):
    active = 'active'
    inactive = 'inactive'

...

if value == Status.active:
    ...
关于第二点:


我在这方面没有什么经验,但我相信SQLAlchemy会做到这一点。

我在GUI设计中最常用Enum。假设您有一个单选按钮,如

这表示一个固定选项列表,因此在引擎盖下,它由一个枚举很好地表示。也就是说,如果用户选择按钮2,则某个回调可能会返回
Enum.Choice.Choice2
。这比返回一个
int 2
或字符串
“选项2”
要好,因为以后没有什么可验证的。换句话说,如果将
“选择2”
更改为
“用户选择2”
,则可能会中断需要原始符号的下游组件

可以将Enum看作是表示静态选择集的便捷快捷方式,而不是创建样板对象类

我发现Java(以及其他静态类型语言)中的Enum更有用,因为您可以在方法签名中声明它们。例如,一个方法可能有签名

public void (Enum.Choice, mychoice)
而不是

public void (String, mychoice)
在第二种情况下,用户可能必须提前知道
mychoice
应该是
“foo”
“bar”
,但是如果他们传入
“baz”
,那会怎么样呢?这是无效的。使用
Enum
将确保不能将无效输入传递给该方法,因为
Enum.Choice
将只包含
foo
bar
字段。如果尝试,则无法创建
baz
选项


对不起,我误入了Java。这是否太离题而没有帮助?

您看到的问题是因为ORM没有将数据库值映射到枚举对象。如果有,您就不必处理
.value

另一种选择是:


如果Status(value)是Status.active:
,因为构造函数从给定参数创建枚举

如果选择字符串,DocString还可以说“必须是类
Status
中定义的常量之一”。为了回答标题问题:Good catch@EthanFurman,我在手机上键入了它,结果很马虎。我把
==
换成了
is
啊,这就解释了大写字母
如果
;)