summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/enum.py14
-rw-r--r--Lib/test/test_enum.py21
2 files changed, 33 insertions, 2 deletions
diff --git a/Lib/enum.py b/Lib/enum.py
index 86f94d9..0a7afc4 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -231,8 +231,17 @@ class EnumMeta(type):
def __contains__(cls, member):
return isinstance(member, cls) and member.name in cls._member_map_
+ def __delattr__(cls, attr):
+ # nicer error message when someone tries to delete an attribute
+ # (see issue19025).
+ if attr in cls._member_map_:
+ raise AttributeError(
+ "%s: cannot delete Enum member." % cls.__name__)
+ super().__delattr__(attr)
+
def __dir__(self):
- return ['__class__', '__doc__', '__members__', '__module__'] + self._member_names_
+ return (['__class__', '__doc__', '__members__', '__module__'] +
+ self._member_names_)
def __getattr__(cls, name):
"""Return the enum member matching `name`
@@ -459,7 +468,8 @@ class Enum(metaclass=EnumMeta):
def __dir__(self):
added_behavior = [m for m in self.__class__.__dict__ if m[0] != '_']
- return ['__class__', '__doc__', '__module__', 'name', 'value'] + added_behavior
+ return (['__class__', '__doc__', '__module__', 'name', 'value'] +
+ added_behavior)
def __eq__(self, other):
if type(other) is self.__class__:
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index 65d0de7..d59c5e3 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -172,6 +172,27 @@ class TestEnum(unittest.TestCase):
with self.assertRaises(AttributeError):
Season.WINTER = 'really cold'
+ def test_attribute_deletion(self):
+ class Season(Enum):
+ SPRING = 1
+ SUMMER = 2
+ AUTUMN = 3
+ WINTER = 4
+
+ def spam(cls):
+ pass
+
+ self.assertTrue(hasattr(Season, 'spam'))
+ del Season.spam
+ self.assertFalse(hasattr(Season, 'spam'))
+
+ with self.assertRaises(AttributeError):
+ del Season.SPRING
+ with self.assertRaises(AttributeError):
+ del Season.DRY
+ with self.assertRaises(AttributeError):
+ del Season.SPRING.name
+
def test_invalid_names(self):
with self.assertRaises(ValueError):
class Wrong(Enum):