mirror of
https://github.com/python/cpython.git
synced 2025-08-22 01:35:16 +00:00
gh-101688: Implement types.get_original_bases (#101827)
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
parent
05b3ce7339
commit
730bbddfdf
6 changed files with 146 additions and 0 deletions
32
Lib/types.py
32
Lib/types.py
|
@ -143,6 +143,38 @@ def _calculate_meta(meta, bases):
|
|||
"of the metaclasses of all its bases")
|
||||
return winner
|
||||
|
||||
|
||||
def get_original_bases(cls, /):
|
||||
"""Return the class's "original" bases prior to modification by `__mro_entries__`.
|
||||
|
||||
Examples::
|
||||
|
||||
from typing import TypeVar, Generic, NamedTuple, TypedDict
|
||||
|
||||
T = TypeVar("T")
|
||||
class Foo(Generic[T]): ...
|
||||
class Bar(Foo[int], float): ...
|
||||
class Baz(list[str]): ...
|
||||
Eggs = NamedTuple("Eggs", [("a", int), ("b", str)])
|
||||
Spam = TypedDict("Spam", {"a": int, "b": str})
|
||||
|
||||
assert get_original_bases(Bar) == (Foo[int], float)
|
||||
assert get_original_bases(Baz) == (list[str],)
|
||||
assert get_original_bases(Eggs) == (NamedTuple,)
|
||||
assert get_original_bases(Spam) == (TypedDict,)
|
||||
assert get_original_bases(int) == (object,)
|
||||
"""
|
||||
try:
|
||||
return cls.__orig_bases__
|
||||
except AttributeError:
|
||||
try:
|
||||
return cls.__bases__
|
||||
except AttributeError:
|
||||
raise TypeError(
|
||||
f'Expected an instance of type, not {type(cls).__name__!r}'
|
||||
) from None
|
||||
|
||||
|
||||
class DynamicClassAttribute:
|
||||
"""Route attribute access on a class to __getattr__.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue