diff --git a/cloudpickle/cloudpickle.py b/cloudpickle/cloudpickle.py index 08882306..0d5137dc 100644 --- a/cloudpickle/cloudpickle.py +++ b/cloudpickle/cloudpickle.py @@ -689,7 +689,7 @@ def _class_getnewargs(obj): def _enum_getnewargs(obj): - members = {e.name: e.value for e in obj} + members = {name: e.value for name, e in obj.__members__.items()} return ( obj.__bases__, obj.__name__, @@ -802,7 +802,7 @@ def _class_getstate(obj): def _enum_getstate(obj): clsdict, slotstate = _class_getstate(obj) - members = {e.name: e.value for e in obj} + members = {name: e.value for name, e in obj.__members__.items()} # Cleanup the clsdict that will be passed to _make_skeleton_enum: # Those attributes are already handled by the metaclass. for attrname in [ diff --git a/tests/cloudpickle_test.py b/tests/cloudpickle_test.py index e2097d1c..8d7805b0 100644 --- a/tests/cloudpickle_test.py +++ b/tests/cloudpickle_test.py @@ -2404,6 +2404,20 @@ def test_locally_defined_intenum(self): assert green1 is not ClonedDynamicColor.BLUE assert ClonedDynamicColor is DynamicColor + def test_locally_defined_flags(self): + members = {"NONE": 0, "FIRST": 11, "SECOND": 37, "THIRD": 389, "ALIAS": 37} + + def check_members(flags): + assert flags.ALIAS is flags.SECOND + return {name: member.value for name, member in flags.__members__.items()} + + with subprocess_worker(protocol=self.protocol) as worker: + for enum_type in (enum.Flag, enum.IntFlag): + flags = enum_type("DynamicFlags", members) + restored = pickle_depickle(flags.SECOND, protocol=self.protocol) + assert restored is flags.SECOND + assert worker.run(check_members, flags) == members + def test_interactively_defined_enum(self): code = """if __name__ == "__main__": from enum import Enum