How to get back name of the enum element?

67,364

Solution 1

You'd have to loop through the class attributes to find the matching name:

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

The generator expression loops over the attributes and their values (taken from the dictionary produced by the vars() function) then returns the first one that matches the value 1.

Enumerations are better modelled by the enum library, available in Python 3.4 or as a backport for earlier versions:

from enum import Enum

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

giving you access to the name and value:

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

Solution 2

2021 update: These answers are out of date. Using Python's standard Enum class,

cur_status.name

will return the name. (STATUS_ERR_NULL_POINTER)

To look up the enum knowing the name:

s = Status['STATUS_ERR_NULL_POINTER']

Solution 3

You don't need to loop through the Enum class but just access _member_map_.

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

Solution 4

Not sure which python version it was introduced, but the hidden attribute _value2member_map_ gives you what you want.

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

str(Status._value2member_map_[1])

Out:

'Status.STATUS_ERR_NULL_POINTER'
Share:
67,364

Related videos on Youtube

Mike
Author by

Mike

I've been writing in C#. Now started to learn Python - lots of fun

Updated on July 17, 2022

Comments

  • Mike
    Mike almost 2 years

    I have an enum defined like this:

    def enum(**enums):
        return type('Enum', (), enums)
    
    Status = enum(
           STATUS_OK=0,
           STATUS_ERR_NULL_POINTER=1, 
           STATUS_ERR_INVALID_PARAMETER=2)
    

    I have a function that returns status as Status enum. How can I get the name of the enum value, and not just value?

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

    I would like to get STATUS_ERR_NULL_POINTER, instead of 1

  • Nerman
    Nerman over 3 years
    The question was to find an enum by value (in your example 0)
  • interestedparty333
    interestedparty333 over 3 years
    This is useful but backwards :)
  • Merlin1896
    Merlin1896 over 3 years
    You could simply use Status(1).name
  • DeusXMachina
    DeusXMachina over 3 years
    Oh, that is much simpler!
  • Ethan Furman
    Ethan Furman about 3 years
    The question is not about Python's Enum, but one the OP created.
  • Ethan Furman
    Ethan Furman about 3 years
    The question is not about Python's Enum, but one the OP created.
  • Ethan Furman
    Ethan Furman about 3 years
    The question is not about Python's Enum, but one the OP created.
  • brandonscript
    brandonscript about 3 years
    OP should be using Python's enum :)