【问题标题】:How to get back name of the enum element?如何取回枚举元素的名称?
【发布时间】:2015-04-26 16:32:15
【问题描述】:

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

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

【问题讨论】:

    标签: python enums


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

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

      cur_status.name
      

      将返回名称。 (STATUS_ERR_NULL_POINTER)

      要查找知道名称的枚举:

      s = Status['STATUS_ERR_NULL_POINTER']
      

      【讨论】:

      • 问题不在于 Python 的 Enum,而是 OP 创建的。
      • OP 应该使用 Python 的枚举 :)
      【解决方案3】:

      您无需遍历 Enum 类,只需访问 _member_map_。

      >>> Status._member_map_['STATUS_OK']
      <Status.STATUS_OK: 0>
      

      【讨论】:

      • 问题是按值查找枚举(在您的示例中为 0)
      • 这很有用但倒退了:)
      • 问题不在于 Python 的 Enum,而是 OP 创建的。
      【解决方案4】:

      不确定它引入了哪个 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'
      

      【讨论】:

      • 你可以简单地使用Status(1).name
      • 哦,那更简单!
      • 问题不在于 Python 的 Enum,而是 OP 创建的。
      【解决方案5】:

      由于某种原因,上面的大多数方法都不适合我。所有方法都将 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'

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

      【讨论】:

        猜你喜欢
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 2013-08-09
        相关资源
        最近更新 更多