[Python-checkins] cpython: Close #18924: Block naive attempts to change an Enum member.

ethan.furman python-checkins at python.org
Fri Sep 6 16:17:19 CEST 2013


http://hg.python.org/cpython/rev/1d88d04aade2
changeset:   85574:1d88d04aade2
user:        Ethan Furman <ethan at stoneleaf.us>
date:        Fri Sep 06 07:16:48 2013 -0700
summary:
  Close #18924:  Block naive attempts to change an Enum member.

files:
  Lib/enum.py           |  13 +++++++++++++
  Lib/test/test_enum.py |   5 +++++
  2 files changed, 18 insertions(+), 0 deletions(-)


diff --git a/Lib/enum.py b/Lib/enum.py
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -263,6 +263,19 @@
     def __repr__(cls):
         return "<enum %r>" % cls.__name__
 
+    def __setattr__(cls, name, value):
+        """Block attempts to reassign Enum members.
+
+        A simple assignment to the class namespace only changes one of the
+        several possible ways to get an Enum member from the Enum class,
+        resulting in an inconsistent Enumeration.
+
+        """
+        member_map = cls.__dict__.get('_member_map_', {})
+        if name in member_map:
+            raise AttributeError('Cannot reassign members.')
+        super().__setattr__(name, value)
+
     def _create_(cls, class_name, names=None, *, module=None, type=None):
         """Convenience method to create a new Enum class.
 
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -152,6 +152,11 @@
         with self.assertRaises(AttributeError):
             Season.SPRING.value = 2
 
+    def test_changing_member(self):
+        Season = self.Season
+        with self.assertRaises(AttributeError):
+            Season.WINTER = 'really cold'
+
     def test_invalid_names(self):
         with self.assertRaises(ValueError):
             class Wrong(Enum):

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list