Skip to content

Commit c0d63bf

Browse files
orlnub123ethanfurman
authored andcommitted
[3.7] bpo-34282: Fix Enum._convert method shadowing members named _convert (GH-9034)
* Fix Enum._convert shadowing members named _convert
1 parent 4902017 commit c0d63bf

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
@@ -171,9 +171,11 @@ def __new__(metacls, cls, bases, classdict):
171171
enum_class._member_map_ = OrderedDict() # name->value map
172172
enum_class._member_type_ = member_type
173173

174-
# save attributes from super classes so we know if we can take
175-
# the shortcut of storing members in the class dict
176-
base_attributes = {a for b in enum_class.mro() for a in b.__dict__}
174+
# save DynamicClassAttribute attributes from super classes so we know
175+
# if we can take the shortcut of storing members in the class dict
176+
dynamic_attributes = {k for c in enum_class.mro()
177+
for k, v in c.__dict__.items()
178+
if isinstance(v, DynamicClassAttribute)}
177179

178180
# Reverse value->name map for hashable values.
179181
enum_class._value2member_map_ = {}
@@ -233,7 +235,7 @@ def __new__(metacls, cls, bases, classdict):
233235
enum_class._member_names_.append(member_name)
234236
# performance boost for any member that would not shadow
235237
# a DynamicClassAttribute
236-
if member_name not in base_attributes:
238+
if member_name not in dynamic_attributes:
237239
setattr(enum_class, member_name, enum_member)
238240
# now add to _member_map_
239241
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
@@ -1516,6 +1516,23 @@ class MoreColor(Color):
15161516
yellow = 6
15171517
self.assertEqual(MoreColor.magenta.hex(), '5 hexlified!')
15181518

1519+
def test_subclass_duplicate_name(self):
1520+
class Base(Enum):
1521+
def test(self):
1522+
pass
1523+
class Test(Base):
1524+
test = 1
1525+
self.assertIs(type(Test.test), Test)
1526+
1527+
def test_subclass_duplicate_name_dynamic(self):
1528+
from types import DynamicClassAttribute
1529+
class Base(Enum):
1530+
@DynamicClassAttribute
1531+
def test(self):
1532+
return 'dynamic'
1533+
class Test(Base):
1534+
test = 1
1535+
self.assertEqual(Test.test.test, 'dynamic')
15191536

15201537
def test_no_duplicates(self):
15211538
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)