diff options
author | orlnub123 <orlnub123@gmail.com> | 2018-09-10 19:39:48 +0300 |
---|---|---|
committer | Ethan Furman <ethan@stoneleaf.us> | 2018-09-10 09:39:48 -0700 |
commit | c0d63bf73b35df374e6e66c08b0e297fb828d744 (patch) | |
tree | cf31a3cfa56b595b26d107f9268037760c5911a8 | |
parent | 49020174305ca3dc90a811b03a05f44873297c61 (diff) | |
download | cpython-git-c0d63bf73b35df374e6e66c08b0e297fb828d744.tar.gz |
[3.7] bpo-34282: Fix Enum._convert method shadowing members named _convert (GH-9034)
* Fix Enum._convert shadowing members named _convert
-rw-r--r-- | Lib/enum.py | 10 | ||||
-rw-r--r-- | Lib/test/test_enum.py | 17 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-09-02-13-33-35.bpo-34282.ztyXH8.rst | 1 |
3 files changed, 24 insertions, 4 deletions
diff --git a/Lib/enum.py b/Lib/enum.py index 576de03180..69b41fe7cb 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -171,9 +171,11 @@ class EnumMeta(type): enum_class._member_map_ = OrderedDict() # name->value map enum_class._member_type_ = member_type - # save attributes from super classes so we know if we can take - # the shortcut of storing members in the class dict - base_attributes = {a for b in enum_class.mro() for a in b.__dict__} + # save DynamicClassAttribute attributes from super classes so we know + # if we can take the shortcut of storing members in the class dict + dynamic_attributes = {k for c in enum_class.mro() + for k, v in c.__dict__.items() + if isinstance(v, DynamicClassAttribute)} # Reverse value->name map for hashable values. enum_class._value2member_map_ = {} @@ -233,7 +235,7 @@ class EnumMeta(type): enum_class._member_names_.append(member_name) # performance boost for any member that would not shadow # a DynamicClassAttribute - if member_name not in base_attributes: + if member_name not in dynamic_attributes: setattr(enum_class, member_name, enum_member) # now add to _member_map_ enum_class._member_map_[member_name] = enum_member diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index ef2d1daaf9..4b17228946 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1516,6 +1516,23 @@ class TestEnum(unittest.TestCase): yellow = 6 self.assertEqual(MoreColor.magenta.hex(), '5 hexlified!') + def test_subclass_duplicate_name(self): + class Base(Enum): + def test(self): + pass + class Test(Base): + test = 1 + self.assertIs(type(Test.test), Test) + + def test_subclass_duplicate_name_dynamic(self): + from types import DynamicClassAttribute + class Base(Enum): + @DynamicClassAttribute + def test(self): + return 'dynamic' + class Test(Base): + test = 1 + self.assertEqual(Test.test.test, 'dynamic') def test_no_duplicates(self): class UniqueEnum(Enum): diff --git a/Misc/NEWS.d/next/Library/2018-09-02-13-33-35.bpo-34282.ztyXH8.rst b/Misc/NEWS.d/next/Library/2018-09-02-13-33-35.bpo-34282.ztyXH8.rst new file mode 100644 index 0000000000..c1e606ab0c --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-09-02-13-33-35.bpo-34282.ztyXH8.rst @@ -0,0 +1 @@ +Fix enum members getting shadowed by parent attributes. |