diff options
author | Raymond Hettinger <python@rcn.com> | 2007-04-11 18:40:58 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2007-04-11 18:40:58 (GMT) |
commit | 13936697f60feedd560d16c94e2524453bb1255a (patch) | |
tree | b32c9dd1d973b430e24d8bdc5dc8f2d27317102a | |
parent | c02e13122ba94b05dc03fd56de393b9129f3ed25 (diff) | |
download | cpython-13936697f60feedd560d16c94e2524453bb1255a.zip cpython-13936697f60feedd560d16c94e2524453bb1255a.tar.gz cpython-13936697f60feedd560d16c94e2524453bb1255a.tar.bz2 |
SF 1191699: Make slices picklable
-rw-r--r-- | Lib/test/test_slice.py | 8 | ||||
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Objects/sliceobject.c | 10 |
3 files changed, 20 insertions, 0 deletions
diff --git a/Lib/test/test_slice.py b/Lib/test/test_slice.py index c34d9ea..83f051f 100644 --- a/Lib/test/test_slice.py +++ b/Lib/test/test_slice.py @@ -2,6 +2,7 @@ import unittest from test import test_support +from cPickle import loads, dumps import sys @@ -102,6 +103,13 @@ class SliceTest(unittest.TestCase): x[1:2] = 42 self.assertEquals(tmp, [(1, 2, 42)]) + def test_pickle(self): + s = slice(10, 20, 3) + for protocol in (0,1,2): + t = loads(dumps(s, protocol)) + self.assertEqual(s, t) + self.assertEqual(s.indices(15), t.indices(15)) + self.assertNotEqual(id(s), id(t)) def test_main(): test_support.run_unittest(SliceTest) @@ -12,6 +12,8 @@ What's New in Python 2.6 alpha 1? Core and builtins ----------------- +- Request #1191699: Slices can now be pickled. + - Patch #1682205: a TypeError while unpacking an iterable is no longer masked by a generic one with the message "unpack non-sequence". diff --git a/Objects/sliceobject.c b/Objects/sliceobject.c index d8a2465..3fb1430 100644 --- a/Objects/sliceobject.c +++ b/Objects/sliceobject.c @@ -274,9 +274,19 @@ indices, and the stride length of the extended slice described by\n\ S. Out of bounds indices are clipped in a manner consistent with the\n\ handling of normal slices."); +static PyObject * +slice_reduce(PySliceObject* self) +{ + return Py_BuildValue("O(OOO)", self->ob_type, self->start, self->stop, self->step); +} + +PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); + static PyMethodDef slice_methods[] = { {"indices", (PyCFunction)slice_indices, METH_O, slice_indices_doc}, + {"__reduce__", (PyCFunction)slice_reduce, + METH_NOARGS, reduce_doc}, {NULL, NULL} }; |