我最近读了一篇帖子,有人提到没有必要在python中使用枚举。我对这是否属实感兴趣。
例如,我使用枚举来表示调制解调器控制信号:
class Signals:
CTS = "CTS"
DSR = "DSR"
...
使用if signal == Signals.CTS:
而不是if signal == "CTS":
或者我遗失了某些东西不是更好吗?
答案 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.CTS
,Signal.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的参考。)
在模块的顶层直接定义常量是在许多标准库模块中完成的(例如re
和os
模块[{{1}等等],所以这种方法很干净。
答案 4 :(得分:0)
答案 5 :(得分:0)
我们需要 Python中的枚举吗?我们需要一个html模块,一个数据库模块或一个bool类型吗?
我会将Enums归类为一个很好的,而不是必须的。
然而,Enums最终出现的部分原因(在Python 3.4中)是因为他们是一个很好的人,很多人手工重新实现了枚举。有这么多私人和公共版本的枚举,互操作性成为一个问题,标准使用成为一个问题,等等。
所以回答你的问题:不,我们不需要一个枚举类型。但无论如何我们现在有一个。甚至有back-ported version。