]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-102558: [Enum] better handling of non-Enum EnumType classes (GH-103060)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 27 Mar 2023 23:49:15 +0000 (16:49 -0700)
committerGitHub <noreply@github.com>
Mon, 27 Mar 2023 23:49:15 +0000 (16:49 -0700)
(cherry picked from commit f4ed2c6ae5915329e49b9f94033ef182400e29fa)

Co-authored-by: Ethan Furman <ethan@stoneleaf.us>
Lib/enum.py
Lib/test/test_enum.py

index ea55f7bbef8637804ac02911f9f4f9f7005187ec..76575500e424032fef51c490f6418ad38b7d2e07 100644 (file)
@@ -936,7 +936,7 @@ class EnumType(type):
     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(
                             "<enum %r> cannot extend %r"
                             % (class_name, base)
@@ -958,7 +958,7 @@ class EnumType(type):
         # 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
@@ -970,7 +970,7 @@ class EnumType(type):
             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__:
@@ -988,12 +988,12 @@ class EnumType(type):
                 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
@@ -1187,8 +1187,6 @@ class Enum(metaclass=EnumType):
         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_))
 
index 2a305e415cd9e2d7bcf7ca5317a235a68375a6b2..e9dae29d26872d6d60041c885eeb0ad467e872b0 100644 (file)
@@ -1321,7 +1321,6 @@ class TestSpecial(unittest.TestCase):
             class Huh(MyStr, MyInt, Enum):
                 One = 1
 
-
     def test_pickle_enum(self):
         if isinstance(Stooges, Exception):
             raise Stooges