在python中枚举的用例是什么?

vla*_*ean 9 python enums

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

我想知道何时使用它们.

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

class Status(enum.Enum):
    active = 'active'
    inactive = 'inactive'
Run Code Online (Sandbox Code Playgroud)

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

if value == Status.active.value:
    ...
Run Code Online (Sandbox Code Playgroud)

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

class Status(object):
    active = 'active'
    inactive = 'inactive'
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Eth*_*man 7

几点:

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

对于第一点:

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

...

if value == Status.active:
    ...
Run Code Online (Sandbox Code Playgroud)

对于第二点:

我在这里的经验很少,但我相信 SQLAlchemy 会做到这一点。


Ada*_*hes 5

我在 GUI 设计中最常使用 Enum。假设您有一个单选按钮,例如在此处输入图片说明

这代表了一个固定选择的列表,所以在幕后,它由一个 Enum 很好地表示。也就是说,如果用户选择按钮 2,则Enum.Choice.Choice2可以通过某个回调返回。这比返回 anint 2或 string更好"choice 2",因为以后没有什么可以验证这些的。换句话说,如果您更改"choice 2""user choice 2",则可能会破坏期望原始符号的下游组件。

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

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

public void (Enum.Choice, mychoice)
Run Code Online (Sandbox Code Playgroud)

代替

public void (String, mychoice)
Run Code Online (Sandbox Code Playgroud)

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

抱歉,我误入了 Java。这是否太离题而无济于事?