[Python-checkins] bpo-34909: keep searching mixins until base class is found (GH-9737) (GH-9738)

Ethan Furman webhook-mailer at python.org
Sat Oct 6 03:43:24 EDT 2018


https://github.com/python/cpython/commit/453b3b0e87cb16345c276b9064a4480ce3794a74
commit: 453b3b0e87cb16345c276b9064a4480ce3794a74
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Ethan Furman <ethan at stoneleaf.us>
date: 2018-10-06T00:43:20-07:00
summary:

bpo-34909: keep searching mixins until base class is found (GH-9737) (GH-9738)

(cherry picked from commit cd45385ffad8910293e5659cfe7ab036e70613b7)

files:
M Lib/enum.py
M Lib/test/test_enum.py

diff --git a/Lib/enum.py b/Lib/enum.py
index 4e8a56818b3c..87f36911144a 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -455,7 +455,7 @@ def _find_data_type(bases):
                     if base is object:
                         continue
                     elif '__new__' in base.__dict__:
-                        if issubclass(base, Enum) and not hasattr(base, '__new_member__'):
+                        if issubclass(base, Enum):
                             continue
                         return base
 
@@ -468,7 +468,6 @@ def _find_data_type(bases):
         member_type = _find_data_type(bases) or object
         if first_enum._member_names_:
             raise TypeError("Cannot extend enumerations")
-
         return member_type, first_enum
 
     @staticmethod
@@ -514,7 +513,6 @@ def _find_new_(classdict, member_type, first_enum):
             use_args = False
         else:
             use_args = True
-
         return __new__, save_new, use_args
 
 
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index 6c147d7ca6e1..60eabbe3d487 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -1813,6 +1813,27 @@ class ReformedColor(StrMixin, IntEnum, SomeEnum, AnotherEnum):
         self.assertEqual(ConfusedColor.RED.social(), "what's up?")
         self.assertTrue(issubclass(ReformedColor, int))
 
+    def test_multiple_inherited_mixin(self):
+        class StrEnum(str, Enum):
+            def __new__(cls, *args, **kwargs):
+                for a in args:
+                    if not isinstance(a, str):
+                        raise TypeError("Enumeration '%s' (%s) is not"
+                                        " a string" % (a, type(a).__name__))
+                return str.__new__(cls, *args, **kwargs)
+        @unique
+        class Decision1(StrEnum):
+            REVERT = "REVERT"
+            REVERT_ALL = "REVERT_ALL"
+            RETRY = "RETRY"
+        class MyEnum(StrEnum):
+            pass
+        @unique
+        class Decision2(MyEnum):
+            REVERT = "REVERT"
+            REVERT_ALL = "REVERT_ALL"
+            RETRY = "RETRY"
+
 
 class TestOrder(unittest.TestCase):
 



More information about the Python-checkins mailing list