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:
parent
0c47f34385
commit
64a9972b40
14
Lib/enum.py
14
Lib/enum.py
|
@ -231,8 +231,17 @@ class EnumMeta(type):
|
||||||
def __contains__(cls, member):
|
def __contains__(cls, member):
|
||||||
return isinstance(member, cls) and member.name in cls._member_map_
|
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):
|
def __dir__(self):
|
||||||
return ['__class__', '__doc__', '__members__', '__module__'] + self._member_names_
|
return (['__class__', '__doc__', '__members__', '__module__'] +
|
||||||
|
self._member_names_)
|
||||||
|
|
||||||
def __getattr__(cls, name):
|
def __getattr__(cls, name):
|
||||||
"""Return the enum member matching `name`
|
"""Return the enum member matching `name`
|
||||||
|
@ -459,7 +468,8 @@ class Enum(metaclass=EnumMeta):
|
||||||
|
|
||||||
def __dir__(self):
|
def __dir__(self):
|
||||||
added_behavior = [m for m in self.__class__.__dict__ if m[0] != '_']
|
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):
|
def __eq__(self, other):
|
||||||
if type(other) is self.__class__:
|
if type(other) is self.__class__:
|
||||||
|
|
|
@ -172,6 +172,27 @@ class TestEnum(unittest.TestCase):
|
||||||
with self.assertRaises(AttributeError):
|
with self.assertRaises(AttributeError):
|
||||||
Season.WINTER = 'really cold'
|
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):
|
def test_invalid_names(self):
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
class Wrong(Enum):
|
class Wrong(Enum):
|
||||||
|
|
Loading…
Reference in New Issue