Change range_repr() to use %R for the start/stop/step attributes.

This commit is contained in:
Walter Dörwald 2007-05-20 08:19:54 +00:00
parent 7569dfe11d
commit 850e516ebc

View file

@ -234,52 +234,28 @@ range_item(rangeobject *r, Py_ssize_t i)
static PyObject * static PyObject *
range_repr(rangeobject *r) range_repr(rangeobject *r)
{ {
PyObject *start_str = NULL, *stop_str = NULL, *step_str = NULL;
PyObject *result = NULL;
Py_ssize_t istart, istep; Py_ssize_t istart, istep;
/* We always need the stop value. */
stop_str = PyObject_Str(r->stop);
if (!stop_str)
return NULL;
/* XXX(nnorwitz): should we use PyObject_Repr instead of str? */
/* Check for special case values for printing. We don't always /* Check for special case values for printing. We don't always
need the start or step values. We don't care about errors need the start or step values. We don't care about errors
(it means overflow), so clear the errors. */ (it means overflow), so clear the errors. */
istart = PyNumber_AsSsize_t(r->start, NULL); istart = PyNumber_AsSsize_t(r->start, NULL);
if (istart != 0 || (istart == -1 && PyErr_Occurred())) { if (istart != 0 || (istart == -1 && PyErr_Occurred())) {
PyErr_Clear(); PyErr_Clear();
start_str = PyObject_Str(r->start);
} }
istep = PyNumber_AsSsize_t(r->step, NULL); istep = PyNumber_AsSsize_t(r->step, NULL);
if (istep != 1 || (istep == -1 && PyErr_Occurred())) { if (istep != 1 || (istep == -1 && PyErr_Occurred())) {
PyErr_Clear(); PyErr_Clear();
step_str = PyObject_Str(r->step);
} }
if (istart == 0 && istep == 1) if (istart == 0 && istep == 1)
result = PyUnicode_FromFormat("range(%s)", return PyUnicode_FromFormat("range(%R)", r->stop);
PyString_AS_STRING(stop_str)); else if (istep == 1)
else if (istep == 1) { return PyUnicode_FromFormat("range(%R, %R)", r->start, r->stop);
if (start_str) else
result = PyUnicode_FromFormat("range(%s, %s)", return PyUnicode_FromFormat("range(%R, %R, %R)",
PyString_AS_STRING(start_str), r->start, r->stop, r->step);
PyString_AS_STRING(stop_str));
}
else if (start_str && step_str)
result = PyUnicode_FromFormat("range(%s, %s, %s)",
PyString_AS_STRING(start_str),
PyString_AS_STRING(stop_str),
PyString_AS_STRING(step_str));
/* else result is NULL and an error should already be set. */
Py_XDECREF(start_str);
Py_XDECREF(stop_str);
Py_XDECREF(step_str);
return result;
} }
static PySequenceMethods range_as_sequence = { static PySequenceMethods range_as_sequence = {