=== modified file 'Lib/test/test_range.py' --- Lib/test/test_range.py 2007-12-04 23:02:19 +0000 +++ Lib/test/test_range.py 2008-04-11 13:40:18 +0000 @@ -61,6 +61,14 @@ self.assertEqual(repr(range(1, 2)), 'range(1, 2)') self.assertEqual(repr(range(1, 2, 3)), 'range(1, 2, 3)') + def test_str(self): + self.assertEqual(str(range(1)), '<0>') + self.assertEqual(str(range(1, 3)), '<1, 2>') + self.assertEqual(str(range(1, 10, 2)), '<1, 3, 5, 7, 9>') + self.assertEqual(str(range(10, 2, -2)), '<10, 8, 6, 4>') + self.assertEqual(str(range(6)), '<0, 1, 2, 3, 4, 5>') + self.assertEqual(str(range(7)), '<0, 1, 2, ..., 5, 6>') + def test_main(): test.test_support.run_unittest(RangeTest) === modified file 'Objects/rangeobject.c' --- Objects/rangeobject.c 2008-02-09 04:13:49 +0000 +++ Objects/rangeobject.c 2008-04-11 02:18:01 +0000 @@ -233,6 +233,97 @@ } static PyObject * +range_str(rangeobject *r) +{ + /* construct a string rep of range like */ + + PyObject *result, *append, *repr; + result = NULL; + append = NULL, + repr = NULL; + + PyObject *rangeitem[7] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + int i; + Py_ssize_t ilen = range_length(r); + if (ilen < 0) + goto Fail; + + if (ilen < 7) { + result = PyUnicode_FromString("<"); + if (!result) + goto Fail; + for(i=0; i"); + if (!repr) + goto Fail; + append = PyUnicode_Concat(result, repr); + if (!append) + goto Fail; + Py_DECREF(result); + Py_DECREF(repr); + result = append; + } + else + { + if ((rangeitem[0] = range_item(r, 0)) == NULL) + goto Fail; + if ((rangeitem[1] = range_item(r, 1)) == NULL) + goto Fail; + if ((rangeitem[2] = range_item(r, 2)) == NULL) + goto Fail; + if ((rangeitem[3] = range_item(r, ilen-2)) == NULL) + goto Fail; + if ((rangeitem[4] = range_item(r, ilen-1)) == NULL) + goto Fail; + ilen = 5; + result = PyUnicode_FromFormat("<%R, %R, %R, ..., %R, %R>", + rangeitem[0], + rangeitem[1], + rangeitem[2], + rangeitem[3], + rangeitem[4]); + if (!result) + goto Fail; + } + + for(i=0; i