[Python-checkins] r64047 - in python/trunk: Doc/library/collections.rst Lib/collections.py Lib/test/test_collections.py
raymond.hettinger
python-checkins at python.org
Mon Jun 9 03:28:30 CEST 2008
Author: raymond.hettinger
Date: Mon Jun 9 03:28:30 2008
New Revision: 64047
Log:
Issue3065: Fixed pickling of named tuples. Added tests.
Modified:
python/trunk/Doc/library/collections.rst
python/trunk/Lib/collections.py
python/trunk/Lib/test/test_collections.py
Modified: python/trunk/Doc/library/collections.rst
==============================================================================
--- python/trunk/Doc/library/collections.rst (original)
+++ python/trunk/Doc/library/collections.rst Mon Jun 9 03:28:30 2008
@@ -539,6 +539,9 @@
if kwds:
raise ValueError('Got unexpected field names: %r' % kwds.keys())
return result
+ <BLANKLINE>
+ def __getnewargs__(self):
+ return tuple(self)
<BLANKLINE>
x = property(itemgetter(0))
y = property(itemgetter(1))
Modified: python/trunk/Lib/collections.py
==============================================================================
--- python/trunk/Lib/collections.py (original)
+++ python/trunk/Lib/collections.py Mon Jun 9 03:28:30 2008
@@ -82,7 +82,9 @@
result = self._make(map(kwds.pop, %(field_names)r, self))
if kwds:
raise ValueError('Got unexpected field names: %%r' %% kwds.keys())
- return result \n\n''' % locals()
+ return result \n
+ def __getnewargs__(self):
+ return tuple(self) \n\n''' % locals()
for i, name in enumerate(field_names):
template += ' %s = property(itemgetter(%d))\n' % (name, i)
if verbose:
Modified: python/trunk/Lib/test/test_collections.py
==============================================================================
--- python/trunk/Lib/test/test_collections.py (original)
+++ python/trunk/Lib/test/test_collections.py Mon Jun 9 03:28:30 2008
@@ -1,12 +1,14 @@
import unittest, doctest
from test import test_support
from collections import namedtuple
+import pickle, cPickle, copy
from collections import Hashable, Iterable, Iterator
from collections import Sized, Container, Callable
from collections import Set, MutableSet
from collections import Mapping, MutableMapping
from collections import Sequence, MutableSequence
+TestNT = namedtuple('TestNT', 'x y z') # type used for pickle tests
class TestNamedTuple(unittest.TestCase):
@@ -108,7 +110,7 @@
self.assertEqual(Dot(1)._replace(d=999), (999,))
self.assertEqual(Dot(1)._fields, ('d',))
- n = 10000
+ n = 5000
import string, random
names = list(set(''.join([random.choice(string.ascii_letters)
for j in range(10)]) for i in range(n)))
@@ -130,6 +132,23 @@
self.assertEqual(b2, tuple(b2_expected))
self.assertEqual(b._fields, tuple(names))
+ def test_pickle(self):
+ p = TestNT(x=10, y=20, z=30)
+ for module in pickle, cPickle:
+ loads = getattr(module, 'loads')
+ dumps = getattr(module, 'dumps')
+ for protocol in -1, 0, 1, 2:
+ q = loads(dumps(p, protocol))
+ self.assertEqual(p, q)
+ self.assertEqual(p._fields, q._fields)
+
+ def test_copy(self):
+ p = TestNT(x=10, y=20, z=30)
+ for copier in copy.copy, copy.deepcopy:
+ q = copier(p)
+ self.assertEqual(p, q)
+ self.assertEqual(p._fields, q._fields)
+
class TestOneTrickPonyABCs(unittest.TestCase):
def test_Hashable(self):
More information about the Python-checkins
mailing list