diff options
author | Ethan Furman <ethan@stoneleaf.us> | 2015-03-18 17:27:57 -0700 |
---|---|---|
committer | Ethan Furman <ethan@stoneleaf.us> | 2015-03-18 17:27:57 -0700 |
commit | 24e837f23126eab7486a77f3cb51b982226adb70 (patch) | |
tree | f73fe9872045e331ab42f6c34b2109620d9347f7 /Lib/enum.py | |
parent | 8eef6a9ad04f6f81190f44ae3ded427e4083baa2 (diff) | |
download | cpython-git-24e837f23126eab7486a77f3cb51b982226adb70.tar.gz |
issue23673
add private method to enum to support replacing global constants with Enum members:
- search for candidate constants via supplied filter
- create new enum class and members
- insert enum class and replace constants with members via supplied module name
- replace __reduce_ex__ with function that returns member name, so previous Python versions can unpickle
modify IntEnum classes to use new method
Diffstat (limited to 'Lib/enum.py')
-rw-r--r-- | Lib/enum.py | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/Lib/enum.py b/Lib/enum.py index 5be13d5c71..1d9ebf0f94 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -519,11 +519,37 @@ class Enum(metaclass=EnumMeta): """The value of the Enum member.""" return self._value_ + @classmethod + def _convert(cls, name, module, filter, source=None): + """ + Create a new Enum subclass that replaces a collection of global constants + """ + # convert all constants from source (or module) that pass filter() to + # a new Enum called name, and export the enum and its members back to + # module; + # 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: + source = module_globals + members = {name: value for name, value in source.items() + if filter(name)} + cls = cls(name, members, module=module) + cls.__reduce_ex__ = _reduce_ex_by_name + module_globals.update(cls.__members__) + module_globals[name] = cls + return cls + class IntEnum(int, Enum): """Enum where members are also (and must be) ints""" +def _reduce_ex_by_name(self, proto): + return self.name + def unique(enumeration): """Class decorator for enumerations ensuring unique member values.""" duplicates = [] |