]> granicus.if.org Git - python/commitdiff
Issue #25665: Make NamedTuple picklable.
authorGuido van Rossum <guido@python.org>
Thu, 19 Nov 2015 16:16:31 +0000 (08:16 -0800)
committerGuido van Rossum <guido@python.org>
Thu, 19 Nov 2015 16:16:31 +0000 (08:16 -0800)
Lib/test/test_typing.py
Lib/typing.py

index ae138c659897bb80b0a1a69386e3906b6e84292b..6ddaba94d54fe1cd1c6419f4ecdcfad0a4f9d11d 100644 (file)
@@ -1163,6 +1163,14 @@ class NamedTupleTests(TestCase):
         assert Emp._fields == ('name', 'id')
         assert Emp._field_types == dict(name=str, id=int)
 
+    def test_pickle(self):
+        global Emp  # pickle wants to reference the class by name
+        Emp = NamedTuple('Emp', [('name', str), ('id', int)])
+        jane = Emp('jane', 37)
+        z = pickle.dumps(jane)
+        jane2 = pickle.loads(z)
+        assert jane == jane2
+
 
 class IOTests(TestCase):
 
index 49c4a06973523c7c696cdeb0b6dbcaae5626b97c..1757f138220e513749646cd35ff5d58ed579b031 100644 (file)
@@ -1479,6 +1479,11 @@ def NamedTuple(typename, fields):
     fields = [(n, t) for n, t in fields]
     cls = collections.namedtuple(typename, [n for n, t in fields])
     cls._field_types = dict(fields)
+    # Set the module to the caller's module (otherwise it'd be 'typing').
+    try:
+        cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__')
+    except (AttributeError, ValueError):
+        pass
     return cls