Skip to content

Commit

Permalink
pythongh-93910: [Enum] restore member.member restriction while keepin…
Browse files Browse the repository at this point in the history
…g performance boost (pythonGH-94913)
  • Loading branch information
ethanfurman authored Jul 17, 2022
1 parent 6da988a commit c20186c
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 1 deletion.
8 changes: 8 additions & 0 deletions Lib/enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -1101,6 +1101,14 @@ def __new__(cls, value):
def __init__(self, *args, **kwds):
pass

def __getattribute__(self, name):
self_dict = super().__getattribute__('__dict__')
cls = super().__getattribute__('__class__')
value = super().__getattribute__(name)
if isinstance(value, cls) and name not in self_dict and name in self._member_names_:
raise AttributeError("<enum '%s'> member has no attribute %r" % (cls.__name__, name))
return super().__getattribute__(name)

def _generate_next_value_(name, start, count, last_values):
"""
Generate the next value when not given.
Expand Down
7 changes: 6 additions & 1 deletion Lib/test/test_enum.py
Original file line number Diff line number Diff line change
Expand Up @@ -2646,14 +2646,19 @@ class Private(Enum):
self.assertEqual(Private._Private__corporal, 'Radar')
self.assertEqual(Private._Private__major_, 'Hoolihan')

@unittest.skip("Accessing all values retained for performance reasons, see GH-93910")
def test_exception_for_member_from_member_access(self):
with self.assertRaisesRegex(AttributeError, "<enum .Di.> member has no attribute .NO."):
class Di(Enum):
YES = 1
NO = 0
nope = Di.YES.NO

def test_no_exception_for_overridden_member_from_member_access(self):
class Di(Enum):
YES = 1
NO = 0
Di.YES.NO = Di.NO
nope = Di.YES.NO

def test_dynamic_members_with_static_methods(self):
#
Expand Down

0 comments on commit c20186c

Please sign in to comment.