bpo-38405: Make nested subclasses of typing.NamedTuple pickleable. (GH-16641)
This commit is contained in:
parent
b690a2759e
commit
13abda4100
|
@ -3468,6 +3468,9 @@ class NewTypeTests(BaseTestCase):
|
|||
|
||||
|
||||
class NamedTupleTests(BaseTestCase):
|
||||
class NestedEmployee(NamedTuple):
|
||||
name: str
|
||||
cool: int
|
||||
|
||||
def test_basics(self):
|
||||
Emp = NamedTuple('Emp', [('name', str), ('id', int)])
|
||||
|
@ -3587,14 +3590,25 @@ class XMethBad2(NamedTuple):
|
|||
with self.assertRaises(TypeError):
|
||||
NamedTuple('Emp', fields=[('name', str), ('id', int)])
|
||||
|
||||
def test_pickle(self):
|
||||
def test_copy_and_pickle(self):
|
||||
global Emp # pickle wants to reference the class by name
|
||||
Emp = NamedTuple('Emp', [('name', str), ('id', int)])
|
||||
jane = Emp('jane', 37)
|
||||
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
||||
z = pickle.dumps(jane, proto)
|
||||
jane2 = pickle.loads(z)
|
||||
self.assertEqual(jane2, jane)
|
||||
Emp = NamedTuple('Emp', [('name', str), ('cool', int)])
|
||||
for cls in Emp, CoolEmployee, self.NestedEmployee:
|
||||
with self.subTest(cls=cls):
|
||||
jane = cls('jane', 37)
|
||||
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
|
||||
z = pickle.dumps(jane, proto)
|
||||
jane2 = pickle.loads(z)
|
||||
self.assertEqual(jane2, jane)
|
||||
self.assertIsInstance(jane2, cls)
|
||||
|
||||
jane2 = copy(jane)
|
||||
self.assertEqual(jane2, jane)
|
||||
self.assertIsInstance(jane2, cls)
|
||||
|
||||
jane2 = deepcopy(jane)
|
||||
self.assertEqual(jane2, jane)
|
||||
self.assertIsInstance(jane2, cls)
|
||||
|
||||
|
||||
class TypedDictTests(BaseTestCase):
|
||||
|
|
|
@ -1593,7 +1593,7 @@ _prohibited = ('__new__', '__init__', '__slots__', '__getnewargs__',
|
|||
'_fields', '_field_defaults', '_field_types',
|
||||
'_make', '_replace', '_asdict', '_source')
|
||||
|
||||
_special = ('__module__', '__name__', '__qualname__', '__annotations__')
|
||||
_special = ('__module__', '__name__', '__annotations__')
|
||||
|
||||
|
||||
class NamedTupleMeta(type):
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Nested subclasses of :class:`typing.NamedTuple` are now pickleable.
|
Loading…
Reference in New Issue