]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Close #19025: Better error message when trying to delete an Enum member.
authorEthan Furman <ethan@stoneleaf.us>
Sun, 22 Sep 2013 23:18:19 +0000 (16:18 -0700)
committerEthan Furman <ethan@stoneleaf.us>
Sun, 22 Sep 2013 23:18:19 +0000 (16:18 -0700)
Also slight code reorg for PEP 8 guidelines.

Lib/enum.py
Lib/test/test_enum.py

index 86f94d905ff1f58389dcb9aced3b5dcf417508f4..0a7afc45c0b53ac0b207afacef1f8266cfbe7799 100644 (file)
@@ -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__:
index 65d0de743a4b4fb96b2491e41b300b12c9fd4d10..d59c5e3ea3cc89871e7b78c6c504a8beccfc016d 100644 (file)
@@ -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):