8000 Issue #25665: Make NamedTuple picklable. · python/typing@3819cbc · GitHub
[go: up one dir, main page]

Skip to content

Commit 3819cbc

Browse files
author
Guido van Rossum
committed
Issue #25665: Make NamedTuple picklable.
1 parent aab2c59 commit 3819cbc

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

src/test_typing.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,6 +1163,14 @@ def test_basics(self):
11631163
assert Emp._fields == ('name', 'id')
11641164
assert Emp._field_types == dict(name=str, id=int)
11651165

1166+
def test_pickle(self):
1167+
global Emp # pickle wants to reference the class by name
1168+
Emp = NamedTuple('Emp', [('name', str), ('id', int)])
1169+
jane = Emp('jane', 37)
1170+
z = pickle.dumps(jane)
1171+
jane2 = pickle.loads(z)
1172+
assert jane == jane2
1173+
11661174

11671175
class IOTests(TestCase):
11681176

src/typing.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,11 @@ def NamedTuple(typename, fields):
14791479
fields = [(n, t) for n, t in fields]
14801480
cls = collections.namedtuple(typename, [n for n, t in fields])
14811481
cls._field_types = dict(fields)
1482+
# Set the module to the caller's module (otherwise it'd be 'typing').
1483+
try:
1484+
cls.__module__ = sys._getframe(1).f_globals.get('__name__', '__main__')
1485+
except (AttributeError, ValueError):
1486+
pass
14821487
return cls
14831488

14841489

0 commit comments

Comments
 (0)
0