Skip to content

Commit

Permalink
[3.12] gh-107576: Ensure __orig_bases__ are our own in `get_origina…
Browse files Browse the repository at this point in the history
…l_bases` (GH-107584) (#107592)

gh-107576: Ensure `__orig_bases__` are our own in `get_original_bases` (GH-107584)
(cherry picked from commit ed4a978)

Co-authored-by: James Hilton-Balfe <gobot1234yt@gmail.com>
Co-authored-by: Chris Bouchard <chris@upliftinglemma.net>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
  • Loading branch information
4 people committed Aug 3, 2023
1 parent 93fcf75 commit d2c7b25
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 7 deletions.
13 changes: 13 additions & 0 deletions Lib/test/test_types.py
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
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
@@ -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.

0 comments on commit d2c7b25

Please sign in to comment.