如何在python中找回枚举元素的名称?

时间:2015-04-26 16:32:15

标签: python enums

我有一个这样定义的枚举:

def enum(**enums):
    return type('Enum', (), enums)

Status = enum(
       STATUS_OK=0,
       STATUS_ERR_NULL_POINTER=1, 
       STATUS_ERR_INVALID_PARAMETER=2)

我有一个返回状态为Status枚举的函数。 如何获取枚举值的名称,而不仅仅是值?

>>> cur_status = get_Status()
>>> print(cur_status)
1

我想获得STATUS_ERR_NULL_POINTER,而不是1

5 个答案:

答案 0 :(得分:23)

您必须遍历类属性才能找到匹配的名称:

name = next(name for name, value in vars(Status).items() if value == 1)

生成器表达式遍历属性及其值(取自vars() function生成的字典)然后返回与值1匹配的第一个。

枚举最好由enum library建模,可在Python 3.4或backport for earlier versions中找到:

from enum import Enum

class Status(Enum):
    STATUS_OK = 0
    STATUS_ERR_NULL_POINTER = 1 
    STATUS_ERR_INVALID_PARAMETER = 2

允许您访问名称和值:

name = Status(1).name  # gives 'STATUS_ERR_NULL_POINTER'
value = Status.STATUS_ERR_NULL_POINTER.value  # gives 1

答案 1 :(得分:5)

2021 年更新: 这些答案已经过时了。使用 Python 的标准 Enum 类,

cur_status.name

将返回名称。 (STATUS_ERR_NULL_POINTER)

要查找知道名称的枚举:

s = Status['STATUS_ERR_NULL_POINTER']

答案 2 :(得分:0)

您不需要遍历Enum类,而只需访问_member_map _。

VC1

答案 3 :(得分:0)

不确定引入了哪个python版本,但是隐藏属性_value2member_map_会为您提供所需的内容。

class Status(Enum):
    STATUS_OK=0
    STATUS_ERR_NULL_POINTER=1
    STATUS_ERR_INVALID_PARAMETER=2

str(Status._value2member_map_[1])

出局:

'Status.STATUS_ERR_NULL_POINTER'

答案 4 :(得分:0)

出于某种原因,上述大多数方法对我不起作用。所有方法都以整数形式返回 Enum 类型。我正在使用 Python 3.7。

在我的解决方案中,我定义了类函数来处理这个问题。它不是纯粹的 Pythonic,但对我来说已经足够了。

from enum import Enum
    
class Status(Enum):
    STATUS_OK = 0
    STATUS_ERR_NULL_POINTER = 1 
    STATUS_ERR_INVALID_PARAMETER = 2
    
    @classmethod
    def name(cls,val):
        return { v:k for k,v in dict(vars(cls)).items() if isinstance(v,int)}.get(val,None)

# test it
stat = Status.STATUS_OK
print(Status.name(stat))

打印:'STATUS_OK'

我们在给它状态后询问状态似乎很明显,但就我而言,这是在其他地方以编程方式设置的