Close #18508 -- fix _value2member_map to always have the member's value
diff --git a/Lib/enum.py b/Lib/enum.py
index 38d95c5..787945a 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -1,5 +1,3 @@
-"""Python Enumerations"""
-
import sys
from collections import OrderedDict
from types import MappingProxyType
@@ -154,11 +152,13 @@
args = (args, ) # wrap it one more time
if not use_args:
enum_member = __new__(enum_class)
- enum_member._value = value
+ original_value = value
else:
enum_member = __new__(enum_class, *args)
- if not hasattr(enum_member, '_value'):
- enum_member._value = member_type(*args)
+ original_value = member_type(*args)
+ if not hasattr(enum_member, '_value'):
+ enum_member._value = original_value
+ value = enum_member._value
enum_member._member_type = member_type
enum_member._name = member_name
enum_member.__init__(*args)
@@ -416,12 +416,14 @@
return value
# by-value search for a matching enum member
# see if it's in the reverse mapping (for hashable values)
- if value in cls._value2member_map:
- return cls._value2member_map[value]
- # not there, now do long search -- O(n) behavior
- for member in cls._member_map.values():
- if member.value == value:
- return member
+ try:
+ if value in cls._value2member_map:
+ return cls._value2member_map[value]
+ except TypeError:
+ # not there, now do long search -- O(n) behavior
+ for member in cls._member_map.values():
+ if member.value == value:
+ return member
raise ValueError("%s is not a valid %s" % (value, cls.__name__))
def __repr__(self):