Skip to content

Commit 22e86fb

Browse files
miss-islingtonorlnub123
authored andcommitted
[3.7] bpo-34282: Fix Enum._convert method shadowing members named _convert (GH-9034) (GH-9229)
* Fix Enum._convert shadowing members named _convert Co-authored-by: orlnub123 <[email protected]>
1 parent 526929b commit 22e86fb

File tree

3 files changed

+24
-4
lines changed

3 files changed

+24
-4
lines changed

Lib/enum.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,9 +155,11 @@ def __new__(metacls, cls, bases, classdict):
155155
enum_class._member_map_ = OrderedDict() # name->value map
156156
enum_class._member_type_ = member_type
157157

158-
# save attributes from super classes so we know if we can take
159-
# the shortcut of storing members in the class dict
160-
base_attributes = {a for b in enum_class.mro() for a in b.__dict__}
158+
# save DynamicClassAttribute attributes from super classes so we know
159+
# if we can take the shortcut of storing members in the class dict
160+
dynamic_attributes = {k for c in enum_class.mro()
161+
for k, v in c.__dict__.items()
162+
if isinstance(v, DynamicClassAttribute)}
161163

162164
# Reverse value->name map for hashable values.
163165
enum_class._value2member_map_ = {}
@@ -217,7 +219,7 @@ def __new__(metacls, cls, bases, classdict):
217219
enum_class._member_names_.append(member_name)
218220
# performance boost for any member that would not shadow
219221
# a DynamicClassAttribute
220-
if member_name not in base_attributes:
222+
if member_name not in dynamic_attributes:
221223
setattr(enum_class, member_name, enum_member)
222224
# now add to _member_map_
223225
enum_class._member_map_[member_name] = enum_member

Lib/test/test_enum.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1506,6 +1506,23 @@ class MoreColor(Color):
15061506
yellow = 6
15071507
self.assertEqual(MoreColor.magenta.hex(), '5 hexlified!')
15081508

1509+
def test_subclass_duplicate_name(self):
1510+
class Base(Enum):
1511+
def test(self):
1512+
pass
1513+
class Test(Base):
1514+
test = 1
1515+
self.assertIs(type(Test.test), Test)
1516+
1517+
def test_subclass_duplicate_name_dynamic(self):
1518+
from types import DynamicClassAttribute
1519+
class Base(Enum):
1520+
@DynamicClassAttribute
1521+
def test(self):
1522+
return 'dynamic'
1523+
class Test(Base):
1524+
test = 1
1525+
self.assertEqual(Test.test.test, 'dynamic')
15091526

15101527
def test_no_duplicates(self):
15111528
class UniqueEnum(Enum):
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fix enum members getting shadowed by parent attributes.

0 commit comments

Comments
 (0)