]> granicus.if.org Git - python/commitdiff
Enum._convert: sort by value, then by name
authorEthan Furman <ethan@stoneleaf.us>
Sun, 11 Sep 2016 20:25:26 +0000 (13:25 -0700)
committerEthan Furman <ethan@stoneleaf.us>
Sun, 11 Sep 2016 20:25:26 +0000 (13:25 -0700)
Lib/enum.py

index 1f8766479e2b472529ea8ee16b6602d5c9b1c776..d8303204ee8becf59f314f9c6852af39a9222ed3 100644 (file)
@@ -616,9 +616,16 @@ class Enum(metaclass=EnumMeta):
         # for a consistent reverse mapping of number to name when there
         # are multiple names for the same number rather than varying
         # between runs due to hash randomization of the module dictionary.
-        members = OrderedDict((name, source[name])
-                              for name in sorted(source.keys())
-                              if filter(name))
+        members = [
+                (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__)