From 602d8db2bc5ddc9a2de2843df92db53365478b3d Mon Sep 17 00:00:00 2001 From: Alexandre Vassalotti Date: Tue, 10 Jun 2008 04:01:23 +0000 Subject: Added better pickling support to xrange objects. Cleaned up the unit test. --- Lib/test/test_xrange.py | 19 ++++++++++--------- Objects/rangeobject.c | 6 +++--- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Lib/test/test_xrange.py b/Lib/test/test_xrange.py index ab68c36..7a2eea5 100644 --- a/Lib/test/test_xrange.py +++ b/Lib/test/test_xrange.py @@ -2,6 +2,7 @@ import test.test_support, unittest import sys +import pickle import warnings warnings.filterwarnings("ignore", "integer argument expected", @@ -57,15 +58,15 @@ class XrangeTest(unittest.TestCase): self.assertEqual(len(r), sys.maxint) self.assertRaises(OverflowError, xrange, -sys.maxint-1, sys.maxint, 2) - def test_getnewargs(self): - def test(*args): - r = xrange(*args) - return list(r) == list(xrange(*r.__getnewargs__())) - tests = [(13,), (0, 11), (-22, 10), (20, 3, -1), - (13, 21, 3), (-2, 2, 2)] - for t in tests: - self.assert_(test(*t), - "xrange.__getnewargs__() failed with %r" % (t,)) + def test_pickling(self): + testcases = [(13,), (0, 11), (-22, 10), (20, 3, -1), + (13, 21, 3), (-2, 2, 2)] + for proto in range(pickle.HIGHEST_PROTOCOL): + for t in testcases: + r = xrange(*t) + self.assertEquals(list(pickle.loads(pickle.dumps(r, proto))), + list(r)) + def test_main(): test.test_support.run_unittest(XrangeTest) diff --git a/Objects/rangeobject.c b/Objects/rangeobject.c index bfc038e..76d3849 100644 --- a/Objects/rangeobject.c +++ b/Objects/rangeobject.c @@ -131,9 +131,9 @@ range_repr(rangeobject *r) /* Pickling support */ static PyObject * -range_getnewargs(rangeobject *r) +range_reduce(rangeobject *r, PyObject *args) { - return Py_BuildValue("(iii)", + return Py_BuildValue("(O(iii))", Py_TYPE(r), r->start, r->start + r->len * r->step, r->step); @@ -155,7 +155,7 @@ PyDoc_STRVAR(reverse_doc, static PyMethodDef range_methods[] = { {"__reversed__", (PyCFunction)range_reverse, METH_NOARGS, reverse_doc}, - {"__getnewargs__", (PyCFunction)range_getnewargs, METH_NOARGS}, + {"__reduce__", (PyCFunction)range_reduce, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; -- cgit v0.12