diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2018-10-06 00:43:20 -0700 |
---|---|---|
committer | Ethan Furman <ethan@stoneleaf.us> | 2018-10-06 00:43:20 -0700 |
commit | 453b3b0e87cb16345c276b9064a4480ce3794a74 (patch) | |
tree | 7ac05e632f1087ab0f5e93018d7a7f38308752ce | |
parent | bpo-34910: Ensure that PyObject_Print() always returns -1 on error. (GH-9733) (diff) | |
download | cpython-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.py | 4 | ||||
-rw-r--r-- | Lib/test/test_enum.py | 21 |
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): |