| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1631,7 +1631,7 @@ These are not used in annotations. They are building blocks for declaring types. | |||
| 1631 | 1631 | standard ``__annotations__`` attribute which has the same information. | |
| 1632 | 1632 | ||
| 1633 | 1633 | .. versionchanged:: 3.11 | |
| 1634 | - Added support of multiple inheritance with :class:`Generic`. | ||
| 1634 | + Added support of multiple inheritence. | ||
| 1635 | 1635 | ||
| 1636 | 1636 | .. class:: NewType(name, tp) | |
| 1637 | 1637 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -644,7 +644,7 @@ time | |||
| 644 | 644 | typing | |
| 645 | 645 | ------ | |
| 646 | 646 | ||
| 647 | - * :class:`~typing.NamedTuple` subclasses can be generic. | ||
| 647 | + * Added support of multiinheritance with :class:`~typing.NamedTuple`. | ||
| 648 | 648 | (Contributed by Serhiy Storchaka in :issue:`43923`.) | |
| 649 | 649 | ||
| 650 | 650 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -5274,10 +5274,38 @@ def _source(self): | |||
| 5274 | 5274 | ||
| 5275 | 5275 | def test_multiple_inheritance(self): | |
| 5276 | 5276 | 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): | ||
| 5281 | 5309 | with self.assertRaises(TypeError): | |
| 5282 | 5310 | class X(NamedTuple, tuple): | |
| 5283 | 5311 | x: int | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2764,10 +2764,6 @@ class NamedTupleMeta(type): | |||
| 2764 | 2764 | ||
| 2765 | 2765 | def __new__(cls, typename, bases, ns): | |
| 2766 | 2766 | 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') | ||
| 2771 | 2767 | bases = tuple(tuple if base is _NamedTuple else base for base in bases) | |
| 2772 | 2768 | types = ns.get('__annotations__', {}) | |
| 2773 | 2769 | default_names = [] | |
| Original file line number | Diff line number | Diff 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`. | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments