我有一个这样定义的枚举:
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
答案 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'
我们在给它状态后询问状态似乎很明显,但就我而言,这是在其他地方以编程方式设置的