热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将字符串与python枚举进行比较?》经验,为你挑选了2个好方法。

我刚刚发现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.redFalse因为Signal.red不是一个字符串.

Signal(brain_detected_colour) is Signal.red失败了ValueError: 'red' is not a valid Signal.



1> bli..:

一个不创建枚举的实例.该Signal(foo)语法用于按值访问Enum成员,这些成员不打算使用它们auto().

但是,可以使用字符串来访问Enum成员,就像dict使用方括号访问a中的值一样:

Signal[brain_detected_colour] is Signal.red

另一种可能性是将字符串与nameEnum成员进行比较:

# Bad practice:
brain_detected_colour is Signal.red.name

但是在这里,我们不测试Enum成员之间的身份,而是比较字符串,因此最好使用相等性测试:

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

(由于字符串实习,字符串之间的身份比较有效,最好不要依赖.感谢@mwchase和@Chris_Rands让我意识到这一点.)

另一种可能性是在创建枚举时明确将成员值设置为其名称:

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

(有关将此方法自动化的方法,请参阅此答案.)

然后,Signal(brain_detected_colour) is Signal.red将是有效的.


在`brain_detected_colour中使用`is`是Signal.red.name`是有风险的; 最好使用`==`.
你依赖于字符串实习,黑暗的实现细节http://guilload.com/python-string-interning/,永远不要使用`is`除非你真的需要比较对象的身份
解决了我的问题.虽然我不能使用`Signal(brain_detected_colour)是Signal.red`(在答案的最后提到,当用字符串值构建枚举时)......`Signal [brain_detected_colour] == Signal.red`确实有效然而.请注意,我考虑了评论说使用`==`进行比较风险较小.

2> Ethan Furman..:

可以auto()返回枚举成员的名称作为其值(auto在文档1的部分中:

>>> class AutoName(Enum):
...     def _generate_next_value_(name, start, count, last_values):
...         return name
...

>>> class Ordinal(AutoName):
...     NORTH = auto()
...     SOUTH = auto()
...     EAST = auto()
...     WEST = auto()
...

>>> list(Ordinal)
[, , , ]

1这需要版本Python 3.6或aenum2.0 2(aenum与Pythons一样长到2.7).

2披露:我是Python stdlibEnum,enum34backport和Advanced Enumeration(aenum) 库的作者.


推荐阅读
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
author-avatar
49897801g9Iq
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有