Skip to content

Commit 5ab2032

Browse files
bpo-45664: Fix resolve_bases() and new_class() for GenericAlias instance as a base (GH-29298)
(cherry picked from commit 2b318ce) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
1 parent 52a9a71 commit 5ab2032

File tree

3 files changed

+20
-1
lines changed

3 files changed

+20
-1
lines changed

Lib/test/test_types.py

+17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import locale
88
import sys
99
import types
10+
import typing
1011
import unittest.mock
1112
import weakref
1213

@@ -888,6 +889,17 @@ def __mro_entries__(self, bases):
888889
self.assertEqual(D.__orig_bases__, (c,))
889890
self.assertEqual(D.__mro__, (D, A, object))
890891

892+
def test_new_class_with_mro_entry_genericalias(self):
893+
L1 = types.new_class('L1', (typing.List[int],), {})
894+
self.assertEqual(L1.__bases__, (list, typing.Generic))
895+
self.assertEqual(L1.__orig_bases__, (typing.List[int],))
896+
self.assertEqual(L1.__mro__, (L1, list, typing.Generic, object))
897+
898+
L2 = types.new_class('L2', (list[int],), {})
899+
self.assertEqual(L2.__bases__, (list,))
900+
self.assertEqual(L2.__orig_bases__, (list[int],))
901+
self.assertEqual(L2.__mro__, (L2, list, object))
902+
891903
def test_new_class_with_mro_entry_none(self):
892904
class A: pass
893905
class B: pass
@@ -1003,6 +1015,11 @@ def __mro_entries__(self, bases):
10031015
for bases in [x, y, z, t]:
10041016
self.assertIs(types.resolve_bases(bases), bases)
10051017

1018+
def test_resolve_bases_with_mro_entry(self):
1019+
self.assertEqual(types.resolve_bases((typing.List[int],)),
1020+
(list, typing.Generic))
1021+
self.assertEqual(types.resolve_bases((list[int],)), (list,))
1022+
10061023
def test_metaclass_derivation(self):
10071024
# issue1294232: correct metaclass calculation
10081025
new_calls = [] # to check the order of __new__ calls

Lib/types.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def resolve_bases(bases):
8282
updated = False
8383
shift = 0
8484
for i, base in enumerate(bases):
85-
if isinstance(base, type):
85+
if isinstance(base, type) and not isinstance(base, GenericAlias):
8686
continue
8787
if not hasattr(base, "__mro_entries__"):
8888
continue
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix :func:`types.resolve_bases` and :func:`types.new_class` for
2+
:class:`types.GenericAlias` instance as a base.

0 commit comments

Comments
 (0)