Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-107576: Ensure __orig_bases__ are our own in get_original_bases #107584

Merged
merged 8 commits into from
Aug 3, 2023
13 changes: 13 additions & 0 deletions Lib/test/test_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -1397,6 +1397,7 @@ class A: pass
class B(typing.Generic[T]): pass
class C(B[int]): pass
class D(B[str], float): pass

self.assertEqual(types.get_original_bases(A), (object,))
self.assertEqual(types.get_original_bases(B), (typing.Generic[T],))
self.assertEqual(types.get_original_bases(C), (B[int],))
Expand All @@ -1409,6 +1410,18 @@ class F(list[int]): pass
self.assertEqual(types.get_original_bases(E), (list[T],))
self.assertEqual(types.get_original_bases(F), (list[int],))

class FirstBase(typing.Generic[T]): pass
class SecondBase(typing.Generic[T]): pass
class First(FirstBase[int]): pass
class Second(SecondBase[int]): pass
class G(First, Second): pass
self.assertEqual(types.get_original_bases(G), (First, Second))

class First_(typing.Generic[T]): pass
class Second_(typing.Generic[T]): pass
class H(First_, Second_): pass
self.assertEqual(types.get_original_bases(H), (First_, Second_))

class ClassBasedNamedTuple(typing.NamedTuple):
x: int

Expand Down
11 changes: 4 additions & 7 deletions Lib/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,14 +165,11 @@ class Baz(list[str]): ...
assert get_original_bases(int) == (object,)
"""
try:
return cls.__orig_bases__
return cls.__dict__.get("__orig_bases__", cls.__bases__)
except AttributeError:
try:
return cls.__bases__
except AttributeError:
raise TypeError(
f'Expected an instance of type, not {type(cls).__name__!r}'
) from None
raise TypeError(
f"Expected an instance of type, not {type(cls).__name__!r}"
) from None


class DynamicClassAttribute:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Fix :func:`types.get_original_bases` to only return
:attr:`!__orig_bases__` if it is present on ``cls`` directly. Patch by
James Hilton-Balfe.