Skip to content

Commit ed4a978

Browse files
Gobot1234chrisbouchardAlexWaygood
authored
gh-107576: Ensure __orig_bases__ are our own in get_original_bases (#107584)
Co-authored-by: Chris Bouchard <[email protected]> Co-authored-by: Alex Waygood <[email protected]>
1 parent 77e0919 commit ed4a978

File tree

3 files changed

+20
-7
lines changed

3 files changed

+20
-7
lines changed

Lib/test/test_types.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1397,6 +1397,7 @@ class A: pass
13971397
class B(typing.Generic[T]): pass
13981398
class C(B[int]): pass
13991399
class D(B[str], float): pass
1400+
14001401
self.assertEqual(types.get_original_bases(A), (object,))
14011402
self.assertEqual(types.get_original_bases(B), (typing.Generic[T],))
14021403
self.assertEqual(types.get_original_bases(C), (B[int],))
@@ -1409,6 +1410,18 @@ class F(list[int]): pass
14091410
self.assertEqual(types.get_original_bases(E), (list[T],))
14101411
self.assertEqual(types.get_original_bases(F), (list[int],))
14111412

1413+
class FirstBase(typing.Generic[T]): pass
1414+
class SecondBase(typing.Generic[T]): pass
1415+
class First(FirstBase[int]): pass
1416+
class Second(SecondBase[int]): pass
1417+
class G(First, Second): pass
1418+
self.assertEqual(types.get_original_bases(G), (First, Second))
1419+
1420+
class First_(typing.Generic[T]): pass
1421+
class Second_(typing.Generic[T]): pass
1422+
class H(First_, Second_): pass
1423+
self.assertEqual(types.get_original_bases(H), (First_, Second_))
1424+
14121425
class ClassBasedNamedTuple(typing.NamedTuple):
14131426
x: int
14141427

Lib/types.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -165,14 +165,11 @@ class Baz(list[str]): ...
165165
assert get_original_bases(int) == (object,)
166166
"""
167167
try:
168-
return cls.__orig_bases__
168+
return cls.__dict__.get("__orig_bases__", cls.__bases__)
169169
except AttributeError:
170-
try:
171-
return cls.__bases__
172-
except AttributeError:
173-
raise TypeError(
174-
f'Expected an instance of type, not {type(cls).__name__!r}'
175-
) from None
170+
raise TypeError(
171+
f"Expected an instance of type, not {type(cls).__name__!r}"
172+
) from None
176173

177174

178175
class DynamicClassAttribute:
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix :func:`types.get_original_bases` to only return
2+
:attr:`!__orig_bases__` if it is present on ``cls`` directly. Patch by
3+
James Hilton-Balfe.

0 commit comments

Comments
 (0)