python - 如何将字符串与python枚举进行比较?

标签 python enums python-3.6

我刚刚发现 Enum 的存在python中的基类,我试图想象它对我有什么用处。

假设我定义了一个红绿灯状态:

from enum import Enum, auto

class Signal(Enum):
    red = auto()
    green = auto()
    orange = auto()

假设我从程序中的某个子系统接收信息,以字符串的形式表示颜色名称,例如 brain_detected_colour = "red"

如何将此字符串与我的交通灯信号进行比较?

显然,brain_detected_colour is Signal.redFalse,因为 Signal.red 不是字符串。

Signal(brain_detected_colour) is Signal.red 失败并出现 ValueError: 'red' is not a valid Signal

最佳答案

一个人不会创建 instance of an Enum . Signal(foo) 语法用于按值访问 Enum 成员,当它们是 auto() 时不打算使用它们。

但是可以使用字符串到 access Enum members就像使用方括号访问 dict 中的值一样:

Signal[brain_detected_colour] is Signal.red

另一种可能性是将字符串与枚举成员的 name 进行比较:

# Bad practice:
brain_detected_colour is Signal.red.name

但在这里,我们不是在测试 Enum 成员之间的身份,而是比较字符串,所以使用相等测试是更好的做法:

# Better practice:
brain_detected_colour == Signal.red.name

(感谢 string interning,字符串之间的身份比较有效,最好不要依赖它。感谢@mwchase 和@Chris_Rands 让我意识到这一点。)

另一种可能性是在创建 Enum 时将成员值显式设置为其名称:

class Signal(Enum):
    red = "red"
    green = "green"
    orange = "orange"

(请参阅 this answer 了解自动执行此操作的方法。)

那么,Signal(brain_detected_colour) is Signal.red 将是有效的。

关于python - 如何将字符串与python枚举进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44781681/

相关文章:

java - 通常如何在 java 中引用枚举项

swift - 我可以扩展 Swift 保留字 "enum"吗?

compiler-errors - 如何克服python的编译(Nuitka)错误

Python字典枚举循环到键/值

python - 将 RGB 颜色转换为 RGBA 的 Plotly 函数? (Python)

python - 如何记录配置文件?

python - "pylab"和 "matplotlib.pyplot"有什么区别?

java - 是否有适用于 Jython 或 JRuby 的框架,或者您可以在 JVM 上运行 py 或 ruby​​ 应用程序吗?

react-native - 如何在 React Native for Android 上设置 keyboardType = "web-search"或 "url"?

python - 如何安装特定python版本的pip?