[Python-checkins] [3.12] gh-107576: Ensure `__orig_bases__` are our own in `get_original_bases` (GH-107584) (#107592)
Yhg1s
webhook-mailer at python.org
Thu Aug 3 11:07:47 EDT 2023
https://github.com/python/cpython/commit/d2c7b25afba3d86ee20331d9fb722a6fe1f768ac
commit: d2c7b25afba3d86ee20331d9fb722a6fe1f768ac
branch: 3.12
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Yhg1s <thomas at python.org>
date: 2023-08-03T17:07:43+02:00
summary:
[3.12] gh-107576: Ensure `__orig_bases__` are our own in `get_original_bases` (GH-107584) (#107592)
gh-107576: Ensure `__orig_bases__` are our own in `get_original_bases` (GH-107584)
(cherry picked from commit ed4a978449c856372d1a7cd389f91cafe2581c87)
Co-authored-by: James Hilton-Balfe <gobot1234yt at gmail.com>
Co-authored-by: Chris Bouchard <chris at upliftinglemma.net>
Co-authored-by: Alex Waygood <Alex.Waygood at Gmail.com>
files:
A Misc/NEWS.d/next/Library/2023-08-03-11-31-11.gh-issue-107576.pO_s9I.rst
M Lib/test/test_types.py
M Lib/types.py
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 81744940f25b8..f2efee90dc024 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -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],))
@@ -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
diff --git a/Lib/types.py b/Lib/types.py
index 6110e6e1de724..b4aa19cec40c8 100644
--- a/Lib/types.py
+++ b/Lib/types.py
@@ -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:
diff --git a/Misc/NEWS.d/next/Library/2023-08-03-11-31-11.gh-issue-107576.pO_s9I.rst b/Misc/NEWS.d/next/Library/2023-08-03-11-31-11.gh-issue-107576.pO_s9I.rst
new file mode 100644
index 0000000000000..67677dd3c8ed2
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-08-03-11-31-11.gh-issue-107576.pO_s9I.rst
@@ -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.
More information about the Python-checkins
mailing list