diff options
author | Ethan Furman <ethan@stoneleaf.us> | 2013-09-06 14:16:48 (GMT) |
---|---|---|
committer | Ethan Furman <ethan@stoneleaf.us> | 2013-09-06 14:16:48 (GMT) |
commit | f203f2d51da404fd59cbfbf40201fe30bd9ea79c (patch) | |
tree | cd0221640a9d9445eada6cfcc21128ff72ec68d3 | |
parent | 96d848ace4785077c2852ede46895775854be676 (diff) | |
download | cpython-f203f2d51da404fd59cbfbf40201fe30bd9ea79c.zip cpython-f203f2d51da404fd59cbfbf40201fe30bd9ea79c.tar.gz cpython-f203f2d51da404fd59cbfbf40201fe30bd9ea79c.tar.bz2 |
Close #18924: Block naive attempts to change an Enum member.
-rw-r--r-- | Lib/enum.py | 13 | ||||
-rw-r--r-- | Lib/test/test_enum.py | 5 |
2 files changed, 18 insertions, 0 deletions
diff --git a/Lib/enum.py b/Lib/enum.py index 8219005..82058ae 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -263,6 +263,19 @@ class EnumMeta(type): 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 index 2a589f5..018e3fd 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -152,6 +152,11 @@ class TestEnum(unittest.TestCase): 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): |