summaryrefslogtreecommitdiff
path: root/modules/language/python/module/enum.py
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/module/enum.py')
-rw-r--r--modules/language/python/module/enum.py17
1 files changed, 13 insertions, 4 deletions
diff --git a/modules/language/python/module/enum.py b/modules/language/python/module/enum.py
index 34e19b6..80b9499 100644
--- a/modules/language/python/module/enum.py
+++ b/modules/language/python/module/enum.py
@@ -17,7 +17,6 @@ __all__ = [
'auto', 'unique',
]
-
def _is_descriptor(obj):
"""Returns True if obj is a descriptor, False otherwise."""
return (
@@ -532,11 +531,13 @@ class Enum(metaclass=EnumMeta):
# all enum instances are actually created during class construction
# without calling this method; this method is called by the metaclass'
# __call__ (i.e. Color(3) ), and by pickle
+
if type(value) is cls:
# For lookups like Color(Color.RED)
return value
# by-value search for a matching enum member
# see if it's in the reverse mapping (for hashable values)
+
try:
if value in cls._value2member_map_:
return cls._value2member_map_[value]
@@ -545,6 +546,7 @@ class Enum(metaclass=EnumMeta):
for member in cls._member_map_.values():
if member._value_ == value:
return member
+
# still not found -- try _missing_ hook
return cls._missing_(value)
@@ -626,6 +628,7 @@ class Enum(metaclass=EnumMeta):
# also, replace the __reduce_ex__ method so unpickling works in
# previous Python versions
module_globals = vars(sys.modules[module])
+
if source:
source = vars(source)
else:
@@ -636,19 +639,24 @@ class Enum(metaclass=EnumMeta):
# are multiple names for the same number rather than varying
# between runs due to hash randomization of the module dictionary.
members = [
- (name, source[name])
- for name in source.keys()
- if filter(name)]
+ (name, source[name])
+ for name in source.keys()
+ if filter(name)]
try:
# sort by value
members.sort(key=lambda t: (t[1], t[0]))
except TypeError:
# unless some values aren't comparable, in which case sort by name
members.sort(key=lambda t: t[0])
+
cls = cls(name, members, module=module)
+
cls.__reduce_ex__ = _reduce_ex_by_name
+
module_globals.update(cls.__members__)
+
module_globals[name] = cls
+
return cls
@@ -887,3 +895,4 @@ def _power_of_two(value):
if value < 1:
return False
return value == 2 ** _high_bit(value)
+