Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7505607

Browse files
committed
Issue 2582: Fix pickling of range objects.
1 parent 1c9a2d9 commit 7505607

2 files changed

Lines changed: 19 additions & 0 deletions

File tree

Lib/test/test_range.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import test.support, unittest
44
import sys
5+
import pickle
56

67
import warnings
78
warnings.filterwarnings("ignore", "integer argument expected",
@@ -61,6 +62,15 @@ def test_repr(self):
6162
self.assertEqual(repr(range(1, 2)), 'range(1, 2)')
6263
self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)')
6364

65+
def test_pickling(self):
66+
testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1),
67+
(13, 21, 3), (-2, 2, 2)]
68+
for proto in range(pickle.HIGHEST_PROTOCOL):
69+
for t in testcases:
70+
r = range(*t)
71+
self.assertEquals(list(pickle.loads(pickle.dumps(r, proto))),
72+
list(r))
73+
6474
def test_main():
6575
test.support.run_unittest(RangeTest)
6676

Objects/rangeobject.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,14 @@ range_repr(rangeobject *r)
252252
r->start, r->stop, r->step);
253253
}
254254

255+
/* Pickling support */
256+
static PyObject *
257+
range_reduce(rangeobject *r, PyObject *args)
258+
{
259+
return Py_BuildValue("(O(OOO))", Py_TYPE(r),
260+
r->start, r->stop, r->step);
261+
}
262+
255263
static PySequenceMethods range_as_sequence = {
256264
(lenfunc)range_length, /* sq_length */
257265
0, /* sq_concat */
@@ -269,6 +277,7 @@ PyDoc_STRVAR(reverse_doc,
269277
static PyMethodDef range_methods[] = {
270278
{"__reversed__", (PyCFunction)range_reverse, METH_NOARGS,
271279
reverse_doc},
280+
{"__reduce__", (PyCFunction)range_reduce, METH_VARARGS},
272281
{NULL, NULL} /* sentinel */
273282
};
274283

0 commit comments

Comments
 (0)