]> granicus.if.org Git - python/commitdiff
bpo-34909: keep searching mixins until base class is found (GH-9737)
authorEthan Furman <ethan@stoneleaf.us>
Sat, 6 Oct 2018 06:29:36 +0000 (23:29 -0700)
committerGitHub <noreply@github.com>
Sat, 6 Oct 2018 06:29:36 +0000 (23:29 -0700)
Lib/enum.py
Lib/test/test_enum.py

index 0ccb30d428e47ba5ee2132e23986aa960343ee27..fec1aed9b25c111b080282efc96ac4ad9f21be1a 100644 (file)
@@ -486,7 +486,7 @@ class EnumMeta(type):
                     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
 
@@ -499,7 +499,6 @@ class EnumMeta(type):
         member_type = _find_data_type(bases) or object
         if first_enum._member_names_:
             raise TypeError("Cannot extend enumerations")
-
         return member_type, first_enum
 
     @staticmethod
@@ -545,7 +544,6 @@ class EnumMeta(type):
             use_args = False
         else:
             use_args = True
-
         return __new__, save_new, use_args
 
 
index aadc11fcc49c3b3692cec59c7b439778821618b5..216f7d5c2830da3cbfb4de4dc647022ff66c008f 100644 (file)
@@ -1842,6 +1842,27 @@ class TestEnum(unittest.TestCase):
         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):