使用枚举在Python中有什么好的用例?

2024-04-20 12:20:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我写Python2代码已经有3年了,虽然我对Enum已经了解很久了,但我们已经开始在我们的项目中使用它们(backported-pypi包enum34)。在

我想知道什么时候用。在

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

class Status(enum.Enum):
    active = 'active'
    inactive = 'inactive'

但是当我们使用这些的时候,我们最终会这样使用它们:

^{pr2}$

因此,在这种情况下使用枚举比仅仅使用一个更简单的类,比如

class Status(object):
    active = 'active'
    inactive = 'inactive'

因为我们可以更容易地使用它,比如value == Status.active。在

到目前为止,我唯一发现这个有用的地方是docstrings,尽管没有我想要的那么有用。我不必显式地说允许的值是'active'和'inactive',我可以声明我的形式参数takes需要Status enum的一个成员(当存在更多的状态时更有用)

所以我不太清楚它们的具体用例是什么-我不知道它们怎么比字符串常量更好。在

简而言之:什么时候使用枚举?在


Tags: 项目代码pypi数据库status地方postgresenum
3条回答

我在GUI设计中经常使用Enum。假设您有一个单选按钮,如enter image description here

这代表了一个固定选项的列表,因此实际上,它由枚举表示。也就是说,如果用户选择按钮2,那么Enum.Choice.Choice2可以通过回调返回。这比返回一个int 2或字符串"choice 2"要好,因为以后没有什么要验证的。换句话说,如果您将"choice 2"更改为"user choice 2",则可能会破坏预期原始符号的下游组件。在

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

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

public void (Enum.Choice, mychoice)

而不是

^{pr2}$

在第二种情况下,用户可能必须提前知道mychoice应该是"foo"或{},但是如果他们传入{},这是无效的呢。使用Enum将确保无效输入不会传递给方法,因为Enum.Choice将只包含字段foo和{}。如果尝试了,则无法创建baz选项。在

对不起,我误入爪哇岛了。这是不是太离题了?在

几点:

  • 您的Enum类可以使用str作为mixin。在
  • 某些数据库层允许将存储的数据转换为Python数据类型。在

第一点:

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

...

if value == Status.active:
    ...

关于第二点:

我在这里没有什么经验,但我相信SQLAlchemy会做到的。在

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

另一种方法是:

if Status(value) is Status.active:,因为构造函数从给定参数创建枚举。在

相关问题 更多 >