Close #19025: Better error message when trying to delete an Enum member.

Also slight code reorg for PEP 8 guidelines.
This commit is contained in:
Ethan Furman 2013-09-22 16:18:19 -07:00
parent 0c47f34385
commit 64a9972b40
2 changed files with 33 additions and 2 deletions

View 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__:

View 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):