How to get back name of the enum element?
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'
Related videos on Youtube
Mike
I've been writing in C#. Now started to learn Python - lots of fun
Updated on July 17, 2022Comments
-
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 of1
-
Nerman over 3 yearsThe question was to find an enum by value (in your example
0
) -
interestedparty333 over 3 yearsThis is useful but backwards :)
-
Merlin1896 over 3 yearsYou could simply use
Status(1).name
-
DeusXMachina over 3 yearsOh, that is much simpler!
-
Ethan Furman about 3 yearsThe question is not about Python's
Enum
, but one the OP created. -
Ethan Furman about 3 yearsThe question is not about Python's
Enum
, but one the OP created. -
Ethan Furman about 3 yearsThe question is not about Python's
Enum
, but one the OP created. -
brandonscript about 3 yearsOP should be using Python's enum :)