From 13936697f60feedd560d16c94e2524453bb1255a Mon Sep 17 00:00:00 2001 From: Raymond Hettinger <python@rcn.com> Date: Wed, 11 Apr 2007 18:40:58 +0000 Subject: [PATCH] SF 1191699: Make slices picklable --- Lib/test/test_slice.py | 8 ++++++++ Misc/NEWS | 2 ++ Objects/sliceobject.c | 10 ++++++++++ 3 files changed, 20 insertions(+) diff --git a/Lib/test/test_slice.py b/Lib/test/test_slice.py index c34d9ea4ad..83f051f688 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) diff --git a/Misc/NEWS b/Misc/NEWS index d15f673275..96b8b1d8cb 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 d8a24653a7..3fb1430308 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} }; -- 2.40.0