Python,Enum 类型有什么好处?

14 浏览
0 Comments

Python,Enum 类型有什么好处?

在Python 3.4中,我们获得了一个标准库中的Enum库:enum。我们可以在Python 2.4到2.7(甚至3.1到3.3)中使用与enum兼容的后备库,即pypi中的enum34

但是,我们已经在没有这个新模块的情况下相当长的时间内完成了工作 - 那么为什么现在有了它?

我对来自其他语言的枚举的目的有一个大致的了解。在Python中,常见的做法是使用一个裸类,并将其称为枚举:

class Colors:
    blue = 1
    green = 2
    red = 3

这可以在API中用于创建值的规范表示,例如:

function_of_color(Colors.green)

如果对此有任何批评的话,它是可变的,你无法轻松地对其进行迭代,我们如何知道整数2的语义?

那么我想我可以使用类似于命名元组的东西,那样会是不可变的?

>>> Colors = namedtuple('Colors', 'blue green red')
>>> colors = Colors('blue', 'green', 'red')
>>> colors
Colors(blue='blue', green='green', red='red')
>>> list(colors)
['blue', 'green', 'red']
>>> len(colors)
3
>>> colors.blue
'blue'
>>> colors.index(colors.blue)
0

命名元组的创建有点冗余(我们需要两次写入每个名称),所以有些不优雅。获取颜色的"数字"也有点不优雅(我们需要两次写入colors)。值的检查将需要使用字符串,这会稍微降低效率。

所以回到枚举。

枚举的目的是什么?它们为语言创造了什么价值?我应该在什么时候使用它们,什么时候应该避免使用它们?

0