From 1bef8ac44f9ce3bebc9a152f8059f7ce10b94034 Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Fri, 24 Mar 2023 17:18:10 -0700 Subject: [PATCH 1/2] fix for non-Enum EnumType class --- Lib/enum.py | 8 +++----- Lib/test/test_enum.py | 1 - 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/Lib/enum.py b/Lib/enum.py index ba927662a43b13..580ffa9b3ac679 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -954,7 +954,7 @@ def _find_data_repr_(mcls, class_name, bases): for base in chain.__mro__: if base is object: continue - elif issubclass(base, Enum): + elif isinstance(base, EnumType): # if we hit an Enum, use it's _value_repr_ return base._value_repr_ elif '__repr__' in base.__dict__: @@ -980,12 +980,12 @@ def _find_data_type_(mcls, class_name, bases): base_chain.add(base) if base is object: continue - elif issubclass(base, Enum): + elif isinstance(base, EnumType): if base._member_type_ is not object: data_types.add(base._member_type_) break elif '__new__' in base.__dict__ or '__init__' in base.__dict__: - if issubclass(base, Enum): + if isinstance(base, EnumType): continue data_types.add(candidate or base) break @@ -1186,8 +1186,6 @@ def _missing_(cls, value): return None def __repr__(self): - if not isinstance(self, Enum): - return repr(self) v_repr = self.__class__._value_repr_ or repr return "<%s.%s: %s>" % (self.__class__.__name__, self._name_, v_repr(self._value_)) diff --git a/Lib/test/test_enum.py b/Lib/test/test_enum.py index bb163c46481a42..f953819cadc894 100644 --- a/Lib/test/test_enum.py +++ b/Lib/test/test_enum.py @@ -1369,7 +1369,6 @@ def repr(self): class Huh(MyStr, MyInt, Enum): One = 1 - def test_pickle_enum(self): if isinstance(Stooges, Exception): raise Stooges From 8739409be07660be070e183da8ca92a3b41bd05c Mon Sep 17 00:00:00 2001 From: Ethan Furman Date: Mon, 27 Mar 2023 13:56:44 -0700 Subject: [PATCH 2/2] fix for non-Enum EnumType classes --- Lib/enum.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Lib/enum.py b/Lib/enum.py index 580ffa9b3ac679..eecabf046f45cd 100644 --- a/Lib/enum.py +++ b/Lib/enum.py @@ -923,7 +923,7 @@ def _convert_(cls, name, module, filter, source=None, *, boundary=None, as_globa def _check_for_existing_members_(mcls, class_name, bases): for chain in bases: for base in chain.__mro__: - if issubclass(base, Enum) and base._member_names_: + if isinstance(base, EnumType) and base._member_names_: raise TypeError( " cannot extend %r" % (class_name, base) @@ -942,7 +942,7 @@ def _get_mixins_(mcls, class_name, bases): # ensure final parent class is an Enum derivative, find any concrete # data type, and check that Enum has no members first_enum = bases[-1] - if not issubclass(first_enum, Enum): + if not isinstance(first_enum, EnumType): raise TypeError("new enumerations should be created as " "`EnumName([mixin_type, ...] [data_type,] enum_type)`") member_type = mcls._find_data_type_(class_name, bases) or object