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

时间:2017-01-18 17:18:04

标签: python enums

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

我想知道何时使用它们。

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

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

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

if value == Status.active.value:
    ...

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

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

因为我们可以更轻松地使用它,例如value == Status.active

到目前为止,我发现这个有用的唯一地方 - 虽然没有我喜欢的那么有用 - 是在文档字符串中。而不是明确说明允许的值是活跃的'和'非活动',我可以声明我的形式参数需要一个Status枚举的成员(当存在更多状态时更有帮助)

因此,我并没有真正了解他们的确切用例 - 我不知道他们如何比字符串常量更好。

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

3 个答案:

答案 0 :(得分:4)

几点:

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

第一点:

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

...

if value == Status.active:
    ...

第二点:

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

答案 1 :(得分:2)

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

这代表了一系列固定的选择,因此在引擎盖下,它由Enum很好地代表。也就是说,如果用户选择按钮2,则某些回调可以返回Enum.Choice.Choice2。这比返回int 2或字符串"choice 2"更好,因为稍后无法验证这些内容。换句话说,如果您将"choice 2"更改为"user choice 2",则可能会破坏期望原始符号的下游组件。

将Enum视为呈现静态选择集的便捷快捷方式,而不是创建样板对象类。

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

public void (Enum.Choice, mychoice)

而不是

public void (String, mychoice)

在第二种情况下,用户可能必须提前知道mychoice应该"foo""bar",但是如果他们传入"baz"会是什么无效。使用Enum可确保无法将无效输入传递给方法,因为Enum.Choice只有字段foobar。如果您尝试过,则无法创建baz选项。

抱歉,我误入了Java。这个主题是否过于有用?

答案 2 :(得分:1)

您看到的问题是因为您的ORM未将数据库值映射到您的Enum对象。如果确实如此,您就不必处理.value

另一种选择是:

if Status(value) is Status.active:因为构造函数从给定的参数创建一个Enum。