什么';python中枚举的一个很好的用例是什么?
我已经写了3年Python 2代码了,虽然我知道Enum很长时间了,但我们已经开始在我们的项目中使用它们(backported-pypi包enum34) 我想知道什么时候使用它们 我们开始使用它们的一个地方是将一些postgres数据库级枚举映射到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
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
作为mixinstr
- 某些数据库层允许将存储的数据转换为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
啊,这就解释了大写字母如果;)