Skip to content

Commit b557508

Browse files
author
rhettinger
committed
Let reversed() work with itself.
git-svn-id: http://svn.python.org/projects/python/trunk@35228 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 1538b28 commit b557508

3 files changed

Lines changed: 17 additions & 1 deletion

File tree

Include/listobject.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ extern "C" {
2222
typedef struct {
2323
PyObject_VAR_HEAD
2424
PyObject **ob_item;
25+
int allocated;
2526
} PyListObject;
2627

2728
PyAPI_DATA(PyTypeObject) PyList_Type;

Lib/test/test_enumerate.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ def test_xrange_optimization(self):
141141
x = xrange(1)
142142
self.assertEqual(type(reversed(x)), type(iter(x)))
143143

144+
def test_double_reverse(self):
145+
s = 'hello'
146+
self.assertEqual(list(reversed(reversed(s))), list(s))
147+
144148
def test_main(verbose=None):
145149
testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig,
146150
TestReversed)

Objects/enumobject.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,11 +230,22 @@ reversed_next(reversedobject *ro)
230230
return item;
231231
}
232232

233+
static PyObject *
234+
reversed_reverse(reversedobject *ro, PyObject *unused)
235+
{
236+
return PyObject_GetIter(ro->seq);
237+
}
238+
233239
PyDoc_STRVAR(reversed_doc,
234240
"reverse(sequence) -> reverse iterator over values of the sequence\n"
235241
"\n"
236242
"Return a reverse iterator");
237243

244+
static PyMethodDef reversed_methods[] = {
245+
{"__reversed__", (PyCFunction)reversed_reverse,
246+
METH_NOARGS, reversed_doc},
247+
};
248+
238249
PyTypeObject PyReversed_Type = {
239250
PyObject_HEAD_INIT(&PyType_Type)
240251
0, /* ob_size */
@@ -266,7 +277,7 @@ PyTypeObject PyReversed_Type = {
266277
0, /* tp_weaklistoffset */
267278
PyObject_SelfIter, /* tp_iter */
268279
(iternextfunc)reversed_next, /* tp_iternext */
269-
0, /* tp_methods */
280+
reversed_methods, /* tp_methods */
270281
0, /* tp_members */
271282
0, /* tp_getset */
272283
0, /* tp_base */

0 commit comments

Comments
 (0)