我刚刚在python中发现了一个Enum基类的存在,我试图想象它对我有什么用处。
假设我定义了红绿灯状态:
from enum import Enum, auto
class Signal(Enum):
red = auto()
green = auto()
orange = auto()
假设我从程序中的某个子系统接收信息,以表示颜色名称的字符串的形式,例如brain_detected_colour = "red"
。
如何将此字符串与我的红绿灯信号进行比较?
显然,brain_detected_colour is Signal.red
是False
,因为Signal.red
不是字符串。
Signal(brain_detected_colour) is Signal.red
失败,出现ValueError: 'red' is not a valid Signal
。
可以让} section of the docs 1中):
auto()
返回枚举成员的名称作为其值(位于^{1这需要Python 3.6版本,或者
aenum
2.02(aenum
与2.7版本的Python一起工作)。2披露:我是Python stdlib ^{} 、^{} backport 和Advanced Enumeration (^{}) 库的作者。
不能创建instance of an Enum。
Signal(foo)
语法用于按值访问枚举成员,当它们是auto()
时,不打算使用这些值。但是,可以使用字符串access Enum members,就像使用方括号访问
dict
中的值一样:另一种可能是将字符串与枚举成员的
name
进行比较:但在这里,我们不是测试枚举成员之间的标识,而是比较字符串,因此最好使用相等测试:
(字符串之间的身份比较由于string interning而起作用,最好不要依赖它。感谢@mwchase和@Chris戆Rands让我意识到这一点。)
另一种可能是在创建枚举时显式地将成员值设置为其名称:
(请参见this answer以获取自动执行此操作的方法。)
那么,
Signal(brain_detected_colour) is Signal.red
将是有效的。相关问题 更多 >
编程相关推荐