diff options
Diffstat (limited to 'modules/language/python/module/enum.py')
-rw-r--r-- | modules/language/python/module/enum.py | 17 |
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) + |