我已经写了大约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枚举的成员(当存在更多状态时更有帮助)
所以我真的不知道它们的确切用例是什么 - 我不知道它们如何比字符串常量更好.
简而言之:何时使用枚举?
几点:
Enum课程可以str用作 mixin。对于第一点:
class Status(str, Enum):
active = 'active'
inactive = 'inactive'
...
if value == Status.active:
...
Run Code Online (Sandbox Code Playgroud)
对于第二点:
我在这里的经验很少,但我相信 SQLAlchemy 会做到这一点。
我在 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只有字段foo和bar. baz如果您尝试过,则无法创建选择。
抱歉,我误入了 Java。这是否太离题而无济于事?
| 归档时间: |
|
| 查看次数: |
1318 次 |
| 最近记录: |