Skip to content

Commit cb21a65

Browse files
committed
More tests and docs following python#103698
1 parent 2134053 commit cb21a65

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

Doc/library/types.rst

+9-1
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,27 @@ Dynamic Type Creation
9696

9797
Examples::
9898

99-
from typing import TypeVar, Generic
99+
from typing import TypeVar, Generic, NamedTuple, TypedDict
100100

101101
T = TypeVar("T")
102102
class Foo(Generic[T]): ...
103103
class Bar(Foo[int], float): ...
104104
class Baz(list[str]): ...
105+
Eggs = NamedTuple("Eggs", [("a", int), ("b", str)])
106+
Spam = TypedDict("Spam", {"a": int, "b": str})
105107

106108
assert Bar.__bases__ == (Foo, float)
107109
assert get_original_bases(Bar) == (Foo[int], float)
108110

109111
assert Baz.__bases__ == (list,)
110112
assert get_original_bases(Baz) == (list[str],)
111113

114+
assert Eggs.__bases__ == (tuple,)
115+
assert get_original_bases(Eggs) == (NamedTuple,)
116+
117+
assert Spam.__bases__ == (dict,)
118+
assert get_original_bases(Spam) == (TypedDict,)
119+
112120
assert int.__bases__ == (object,)
113121
assert get_original_bases(int) == (object,)
114122

Lib/test/test_types.py

+37-2
Original file line numberDiff line numberDiff line change
@@ -1378,10 +1378,45 @@ class F(list[int]): pass
13781378
self.assertEqual(types.get_original_bases(E), (list[T],))
13791379
self.assertEqual(types.get_original_bases(F), (list[int],))
13801380

1381-
class G(typing.NamedTuple):
1381+
class ClassBasedNamedTuple(typing.NamedTuple):
13821382
x: int
13831383

1384-
self.assertIs(types.get_original_bases(G)[0], typing.NamedTuple)
1384+
class GenericNamedTuple(typing.NamedTuple, typing.Generic[T]):
1385+
x: T
1386+
1387+
CallBasedNamedTuple = typing.NamedTuple("CallBasedNamedTuple", [("x", int)])
1388+
1389+
self.assertIs(
1390+
types.get_original_bases(ClassBasedNamedTuple)[0], typing.NamedTuple
1391+
)
1392+
self.assertEqual(
1393+
types.get_original_bases(GenericNamedTuple),
1394+
(typing.NamedTuple, typing.Generic[T])
1395+
)
1396+
self.assertIs(
1397+
types.get_original_bases(CallBasedNamedTuple)[0], typing.NamedTuple
1398+
)
1399+
1400+
class ClassBasedTypedDict(typing.TypedDict):
1401+
x: int
1402+
1403+
class GenericTypedDict(typing.TypedDict, typing.Generic[T]):
1404+
x: T
1405+
1406+
CallBasedTypedDict = typing.TypedDict("CallBasedTypedDict", {"x": int})
1407+
1408+
self.assertIs(
1409+
types.get_original_bases(ClassBasedTypedDict)[0],
1410+
typing.TypedDict
1411+
)
1412+
self.assertEqual(
1413+
types.get_original_bases(GenericTypedDict),
1414+
(typing.TypedDict, typing.Generic[T])
1415+
)
1416+
self.assertIs(
1417+
types.get_original_bases(CallBasedTypedDict)[0],
1418+
typing.TypedDict
1419+
)
13851420

13861421
with self.assertRaisesRegex(TypeError, "Expected an instance of type"):
13871422
types.get_original_bases(object())

Lib/types.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,19 @@ def get_original_bases(cls, /):
149149
150150
Examples::
151151
152-
from typing import TypeVar, Generic
152+
from typing import TypeVar, Generic, NamedTuple, TypedDict
153153
154154
T = TypeVar("T")
155155
class Foo(Generic[T]): ...
156156
class Bar(Foo[int], float): ...
157157
class Baz(list[str]): ...
158+
Eggs = NamedTuple("Eggs", [("a", int), ("b", str)])
159+
Spam = TypedDict("Spam", {"a": int, "b": str})
158160
159161
assert get_original_bases(Bar) == (Foo[int], float)
160162
assert get_original_bases(Baz) == (list[str],)
163+
assert get_original_bases(Eggs) == (NamedTuple,)
164+
assert get_original_bases(Spam) == (TypedDict,)
161165
assert get_original_bases(int) == (object,)
162166
"""
163167
try:

0 commit comments

Comments
 (0)