[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