不需要枚举

时间:2011-10-25 09:00:37

标签: python

我最近读了一篇帖子,有人提到没有必要在python中使用枚举。我对这是否属实感兴趣。

例如,我使用枚举来表示调制解调器控制信号:

class Signals:
  CTS = "CTS"
  DSR = "DSR"
  ...

使用if signal == Signals.CTS:而不是if signal == "CTS":或者我遗失了某些东西不是更好吗?

6 个答案:

答案 0 :(得分:5)

Signals.CTS似乎比“CTS”更好。但是Signals不是枚举,它是一个具有特定字段的类。正如我所听到的那样,声明是你不需要单独的枚举语言结构,因为你可以像你在问题中所做的那样做,或者可能:

CTS, DSR, XXX, YYY, ZZZ = range(5)

如果您在信号模块中有此功能,则可以按照类似的方式导入它,例如if signal == signals.CTS:。这用于标准库中的几个模块,包括re和os模块。

答案 1 :(得分:1)

在你的确切示例中,我想可以使用定义的常量,因为它会引发错误,当找不到常量时,字符串中的拼写错误就不会。

我猜使用面向对象的解决方案至少相同。

BTW:if "CTS": 总是True,因为只有空字符串被解释为False

答案 2 :(得分:0)

这取决于您是使用Signal.CTSSignal.DSR的值作为数据。例如,如果将这些字符串发送到实际调制解调器。如果这是真的,那么按照你的方式定义别名将是一个好主意,因为外部接口往往会改变或者不那么统一。否则,如果您不使用符号值,则可以跳过抽象层并直接使用字符串。

唯一不要混合内部符号和外部数据。

答案 3 :(得分:0)

如果你想拥有有意义的字符串常量(CTS = "CTS"等),你可以这样做:

for constant_name in ('CTS', 'DSR'):  # All constant names go here
    globals()[constant_name] = constant_name

这将变量CTS dans DSR定义为您想要的值。 (关于使用globals()Programmatically creating variables in Python的参考。)

在模块的顶层直接定义常量是在许多标准库模块中完成的(例如reos模块[{{1}等等],所以这种方法很干净。

答案 4 :(得分:0)

我认为加载枚举(设置任意值,按位运算,空格-d描述)还有很多其他内容。

请阅读以下非常短的帖子,查看提供的enum课程,并自我判断。

Python Enum Post

答案 5 :(得分:0)

我们需要 Python中的枚举吗?我们需要一个html模块,一个数据库模块或一个bool类型吗?

我会将Enums归类为一个很好的,而不是必须的。

然而,Enums最终出现的部分原因(在Python 3.4中)是因为他们是一个很好的人,很多人手工重新实现了枚举。有这么多私人和公共版本的枚举,互操作性成为一个问题,标准使用成为一个问题,等等。

所以回答你的问题:不,我们不需要一个枚举类型。但无论如何我们现在有一个。甚至有back-ported version