Skip to content

Commit 64f0c5f

Browse files
bpo-43923: Add support of multiple inheritance with typing.NamedTuple
1 parent 939d5f0 commit 64f0c5f

File tree

5 files changed

+35
-12
lines changed

5 files changed

+35
-12
lines changed

Doc/library/typing.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -1631,7 +1631,7 @@ These are not used in annotations. They are building blocks for declaring types.
16311631
standard ``__annotations__`` attribute which has the same information.
16321632

16331633
.. versionchanged:: 3.11
1634-
Added support of multiple inheritance with :class:`Generic`.
1634+
Added support of multiple inheritence.
16351635

16361636
.. class:: NewType(name, tp)
16371637

Doc/whatsnew/3.11.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -644,7 +644,7 @@ time
644644
typing
645645
------
646646

647-
* :class:`~typing.NamedTuple` subclasses can be generic.
647+
* Added support of multiinheritance with :class:`~typing.NamedTuple`.
648648
(Contributed by Serhiy Storchaka in :issue:`43923`.)
649649

650650

Lib/test/test_typing.py

+32-4
Original file line numberDiff line numberDiff line change
@@ -5274,10 +5274,38 @@ def _source(self):
52745274

52755275
def test_multiple_inheritance(self):
52765276
class A:
5277-
pass
5278-
with self.assertRaises(TypeError):
5279-
class X(NamedTuple, A):
5280-
x: int
5277+
@property
5278+
def x(self):
5279+
return 4
5280+
@property
5281+
def y(self):
5282+
return 5
5283+
def __len__(self):
5284+
return 10
5285+
5286+
class X(NamedTuple, A):
5287+
x: int
5288+
self.assertEqual(X.__bases__, (tuple, A))
5289+
self.assertEqual(X.__orig_bases__, (NamedTuple, A))
5290+
self.assertEqual(X.__mro__, (X, tuple, A, object))
5291+
5292+
a = X(3)
5293+
self.assertEqual(a.x, 3)
5294+
self.assertEqual(a.y, 5)
5295+
self.assertEqual(len(a), 1)
5296+
5297+
class Y(A, NamedTuple):
5298+
x: int
5299+
self.assertEqual(Y.__bases__, (A, tuple))
5300+
self.assertEqual(Y.__orig_bases__, (A, NamedTuple))
5301+
self.assertEqual(Y.__mro__, (Y, A, tuple, object))
5302+
5303+
a = Y(3)
5304+
self.assertEqual(a.x, 3)
5305+
self.assertEqual(a.y, 5)
5306+
self.assertEqual(len(a), 10)
5307+
5308+
def test_multiple_inheritance_errors(self):
52815309
with self.assertRaises(TypeError):
52825310
class X(NamedTuple, tuple):
52835311
x: int

Lib/typing.py

-4
Original file line numberDiff line numberDiff line change
@@ -2764,10 +2764,6 @@ class NamedTupleMeta(type):
27642764

27652765
def __new__(cls, typename, bases, ns):
27662766
assert _NamedTuple in bases
2767-
for base in bases:
2768-
if base is not _NamedTuple and base is not Generic:
2769-
raise TypeError('can only inherit from a NamedTuple type '
2770-
'and Generic')
27712767
bases = tuple(tuple if base is _NamedTuple else base for base in bases)
27722768
types = ns.get('__annotations__', {})
27732769
default_names = []
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
Add support of multiple inheritance of :class:`typing.NamedTuple` with
2-
:class:`typing.Generic`.
1+
Add support of multiple inheritance with :class:`typing.NamedTuple`.

0 commit comments

Comments
 (0)