signal, socket, and ssl module IntEnum constant name lookups now return a

consistent name for values having multiple names.  Ex: signal.Signals(6)
now refers to itself as signal.SIGALRM rather than flipping between that
and signal.SIGIOT based on the interpreter's hash randomization seed.

This helps finish issue27167.
This commit is contained in:
Gregory P. Smith ext:(%20%5BGoogle%20Inc.%5D) 2016-06-03 19:14:52 +00:00
parent 16931c3559
commit 6f20bd6063
3 changed files with 49 additions and 2 deletions

View file

@ -550,8 +550,14 @@ class Enum(metaclass=EnumMeta):
source = vars(source)
else:
source = module_globals
members = {name: value for name, value in source.items()
if filter(name)}
# We use an OrderedDict of sorted source keys so that the
# _value2member_map is populated in the same order every time
# 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))
cls = cls(name, members, module=module)
cls.__reduce_ex__ = _reduce_ex_by_name
module_globals.update(cls.__members__)