Python如何获取枚举类型的名称?

8

我有一个类似这样的枚举

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,但这会导致错误,提示该枚举项不存在'name'属性。

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


2
我无法重现这个错误。 - juanpa.arrivillaga
1
你正在使用Python的标准发行版吗?是哪个版本? - wbadart
我无法在Python 3.5.2或Python 2.7.12中重现此错误。 - Christian Dean
3
如果你收到了一份回溯信息,请逐字逐句地发布完整的错误信息。 - Christian Dean
4个回答

9
我怀疑你正在使用已过时的pip-installable库,名为enum。如果是这样,你会得到类似以下的内容。
>>> 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 后移版本。相比之下,使用“真正”的枚举类型会更好地解决问题。

>>> 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"来自行确认,如果您正在使用旧版本的Python,则仅会看到"NAME / enum - Python中强大的枚举类型支持"。请注意保留html标记。

你说得对,我确实执行了 pip install enum。看起来那是旧版本?所以我应该执行 pip install enum34 代替吗? - Hary
@Hary:真的,你应该使用现代的Python!;-) 但是,目前enum34也可以工作。 - DSM
我正在使用Python 2.7版本,那不就够了吗?我是否仍需要在Python 2.7中执行pip install enum34命令? - Hary
我确实在使用旧版本的enum。我安装了enum34,它按照你的解释工作了。我想知道这些枚举是否不是Python标准发行版的一部分,不确定为什么这样的标准构造需要单独安装? - Hary
我们在10年前开始转向Python3 :) enum3.4中被引入Python中。 - Shawn Mehan

5
你可以从对象附带的__dict__开始调查。有趣的阅读材料可以在其中找到。
print(testEnum.__dict__)

在该字典中,您将看到一个良好的起点,您可以使用以下内容进行测试:
print(testEnum._member_names_)

实际上,这产生了

['Code_1', 'Code_2']

4

在Python3.9中可以使用:

testEnum.__members__

1

dir(testEnum)将为您提供字典键。

例如:

dir(testEnum)

返回:

['Code_1', 'Code_2', 'class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref']


我不确定这是否回答了问题。你能详细说明一下吗? - Christian Dean
OP似乎正在寻找一种返回“Code_1”和“Code_2”的方法。例如,dir(testEnum)[0]将返回Code_1。 - BirdLaw
好的,我明白你想做什么。但他试图通过执行 testEnum.Code_1 获取名称,就像文档中说的那样。 - Christian Dean
我认为OP有些困惑。testEnum.Code_1.name不会起作用,因为Code_1不是一个带有“name”属性的对象。Code_1 = 'blah'只是一个字符串声明(即一个变量)。没有办法通过变量的值来获取变量的名称,因为可能有多个变量具有相同的值。 - BirdLaw
1
不是,他没有。他的代码应该可以工作,因为他继承了标准库中的enum.Enum参考链接 - Christian Dean
2
如果我有一个枚举,将其转换为字典并使用字典索引(如[0])引用其成员是不直观的,这违背了使用枚举的初衷。使用枚举让代码与用户交流时可以使用 enum.code_1,而不是使用 dict(enum)[0]。 - Hary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接