【问题标题】:python how to get name of the enumpython如何获取枚举的名称
【发布时间】:2017-06-08 23:14:37
【问题描述】:

我有一个这样的枚举

class testEnum(Enum):
   Code_1 = "successful response"
   Code_2 = "failure response"

然后我有一个方法,它将枚举键名称Code_1 和枚举键值successful response 作为输入。

如果我发送testEnum.Code_1,则解析为successful response,而不是Code_1

我在网上查看了一些建议使用 testEnum.Code_1.name 的文档,但这会引发错误,指出枚举项不存在“名称”。

有人知道如何获取枚举键的名称吗?

【问题讨论】:

  • 我无法重现错误。
  • 你使用的是标准的python发行版吗?哪个版本?
  • 我无法在 Python 3.5.2 和 Python 2.7.12 中重现该错误。
  • 如果您得到追溯,请逐字发布完整的错误。

标签: python python-2.7 enums


【解决方案1】:

我怀疑发生的事情是您使用了名为 enum 的过时 pip 可安装库。如果你这样做了,你会得到类似的东西

>>> from enum import Enum
>>> class testEnum(Enum):
...    Code_1 = "successful response"
...    Code_2 = "failure response"
... 
>>> testEnum.Code_1
'successful response'
>>> testEnum.Code_1.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute 'name'

而使用“真正的”枚举(如果您使用现代 Python,则在标准库中为 enum,如果不是,则为 enum34 backport),您会看到

>>> from enum import Enum
>>> class testEnum(Enum):
...    Code_1 = "successful response"
...    Code_2 = "failure response"
... 
>>> testEnum.Code_1
<testEnum.Code_1: 'successful response'>
>>> testEnum.Code_1.name
'Code_1'

您可以通过键入 help(enum) 来独立确认这一点,并查看您是否看到“NAME / enum / MODULE REFERENCE / https://docs.python.org/3.6/library/enum”(如您所见)或只是“NAME / enum - Python 中强大的枚举类型支持”,如果您正在使用旧版本。

【讨论】:

  • 你是对的,我确实 pip install enum。那个好像是旧的?所以我应该改为 pip install enum34 吗?
  • @Hary:真的,您应该使用现代 Python! ;-) 但是是的, enum34 目前应该可以工作。
  • 我使用的是python 2.7版。那还不够吗?我还需要在 python 2.7 中执行 pip install enum34 吗?
  • 我确实使用的是旧版本的枚举。我安装了 enum34 并且它按照你的解释工作。想知道这些枚举是否不是标准 python 发行版的一部分,并且不确定为什么需要单独安装像枚举这样的标准构造?
  • 我们在 10 年前开始迁移到 python3 :) enum3.4 进入 python。
【解决方案2】:

您可以使用对象随附的__dict__ 开始您的调查。用

找到有趣的读物
print(testEnum.__dict__)

在该字典中,您将看到一个良好的开端,您可以使用以下内容进行测试:

print(testEnum._member_names_)

确实会产生

['Code_1', 'Code_2']

【讨论】:

    【解决方案3】:

    在python3.9中可以使用:

    testEnum.__members__
    

    【讨论】:

      【解决方案4】:

      dir(testEnum) 会给你字典键。

      例如

      dir(testEnum)
      

      返回:

      ['Code_1', '代码_2', '', 'delattr', 'dict', '目录', '文档', 'eq', '格式', 'ge', '获取属性', 'gt', '散列', '初始化', 'init_subclass', '', 'lt', '模块', '没有', '', '减少', 'reduce_ex', 'repr', 'setattr', '大小', 'str', '子类挂钩', 'weakref']

      【讨论】:

      • 我不确定这如何回答这个问题。你能详细说明一下吗?
      • OP 似乎正在寻找一种返回“Code_1”和“Code_2”的方法。例如,dir(testEnum)[0] 将返回 Code_1。
      • 好的,我明白你想做什么了。但他试图从testEnum.Code_1 中获得名字,就像文档上说的那样。
      • 不,他没有。他的代码应该可以工作,因为他继承自 enum.Enumfrom the standard library
      • 如果我有一个枚举,那么将其转换为字典并使用 [0] 之类的字典索引引用它的成员是违反直觉的,并且违背了使用枚举的全部目的。当您执行 enum.code_1 而不是执行 dict(enum)[0] 时,使用枚举可以让代码与用户对话
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 2013-04-08
      • 2018-04-05
      • 2021-07-25
      • 1970-01-01
      相关资源
      最近更新 更多