summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2018-10-06 00:43:20 -0700
committerEthan Furman <ethan@stoneleaf.us>2018-10-06 00:43:20 -0700
commit453b3b0e87cb16345c276b9064a4480ce3794a74 (patch)
tree7ac05e632f1087ab0f5e93018d7a7f38308752ce
parentbpo-34910: Ensure that PyObject_Print() always returns -1 on error. (GH-9733) (diff)
downloadcpython-453b3b0e87cb16345c276b9064a4480ce3794a74.tar.gz
cpython-453b3b0e87cb16345c276b9064a4480ce3794a74.tar.bz2
cpython-453b3b0e87cb16345c276b9064a4480ce3794a74.zip
bpo-34909: keep searching mixins until base class is found (GH-9737) (GH-9738)
(cherry picked from commit cd45385ffad8910293e5659cfe7ab036e70613b7)
-rw-r--r--Lib/enum.py4
-rw-r--r--Lib/test/test_enum.py21
2 files changed, 22 insertions, 3 deletions
diff --git a/Lib/enum.py b/Lib/enum.py
index 4e8a56818b3..87f36911144 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -455,7 +455,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
@@ -468,7 +468,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
@@ -514,7 +513,6 @@ class EnumMeta(type):
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 6c147d7ca6e..60eabbe3d48 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -1813,6 +1813,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):