summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2020-12-07 23:50:14 (GMT)
committerGitHub <noreply@github.com>2020-12-07 23:50:14 (GMT)
commit699e5e448919283578afe445069ab93b34bf8eae (patch)
tree4fe456dde5866ee8ebd5345f255f57456330d208
parentb6d6f5367da1f2e3f749c358ae8563c56a0cc395 (diff)
downloadcpython-699e5e448919283578afe445069ab93b34bf8eae.zip
cpython-699e5e448919283578afe445069ab93b34bf8eae.tar.gz
cpython-699e5e448919283578afe445069ab93b34bf8eae.tar.bz2
bpo-41889: [Enum] fix multiple-inheritance regression (GH-22487) (GH-23672)
(cherry picked from commit c266736ec1f9ebef38b134ceb4832df015711b38)
-rw-r--r--Lib/enum.py11
-rw-r--r--Lib/test/test_enum.py26
-rw-r--r--Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst1
3 files changed, 35 insertions, 3 deletions
diff --git a/Lib/enum.py b/Lib/enum.py
index de9ed4c..da809e2 100644
--- a/Lib/enum.py
+++ b/Lib/enum.py
@@ -145,8 +145,9 @@ class EnumMeta(type):
for key in ignore:
classdict.pop(key, None)
member_type, first_enum = metacls._get_mixins_(cls, bases)
- __new__, save_new, use_args = metacls._find_new_(classdict, member_type,
- first_enum)
+ __new__, save_new, use_args = metacls._find_new_(
+ classdict, member_type, first_enum,
+ )
# save enum items into separate mapping so they don't get baked into
# the new class
@@ -506,12 +507,16 @@ class EnumMeta(type):
for base in chain.__mro__:
if base is object:
continue
+ elif issubclass(base, Enum):
+ if base._member_type_ is not object:
+ data_types.append(base._member_type_)
+ break
elif '__new__' in base.__dict__:
if issubclass(base, Enum):
continue
data_types.append(candidate or base)
break
- elif not issubclass(base, Enum):
+ else:
candidate = base
if len(data_types) > 1:
raise TypeError('%r: too many data types: %r' % (class_name, data_types))
diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py
index 745962a..7f6e6bf 100644
--- a/Lib/test/test_enum.py
+++ b/Lib/test/test_enum.py
@@ -2000,6 +2000,32 @@ class TestEnum(unittest.TestCase):
REVERT_ALL = "REVERT_ALL"
RETRY = "RETRY"
+ def test_multiple_mixin_inherited(self):
+ class MyInt(int):
+ def __new__(cls, value):
+ return super().__new__(cls, value)
+
+ class HexMixin:
+ def __repr__(self):
+ return hex(self)
+
+ class MyIntEnum(HexMixin, MyInt, enum.Enum):
+ pass
+
+ class Foo(MyIntEnum):
+ TEST = 1
+ self.assertTrue(isinstance(Foo.TEST, MyInt))
+ self.assertEqual(repr(Foo.TEST), "0x1")
+
+ class Fee(MyIntEnum):
+ TEST = 1
+ def __new__(cls, value):
+ value += 1
+ member = int.__new__(cls, value)
+ member._value_ = value
+ return member
+ self.assertEqual(Fee.TEST, 2)
+
def test_empty_globals(self):
# bpo-35717: sys._getframe(2).f_globals['__name__'] fails with KeyError
# when using compile and exec because f_globals is empty
diff --git a/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst b/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst
new file mode 100644
index 0000000..768865a
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2020-10-01-16-17-11.bpo-41889.qLkNh8.rst
@@ -0,0 +1 @@
+Enum: fix regression involving inheriting a multiply-inherited enum