Skip to content

Commit bdda458

Browse files
author
rhettinger
committed
Make reversed() transparent with respect to length.
git-svn-id: http://svn.python.org/projects/python/trunk@35253 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent fcb5be4 commit bdda458

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

Lib/test/test_enumerate.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,10 @@ def test_double_reverse(self):
145145
s = 'hello'
146146
self.assertEqual(list(reversed(reversed(s))), list(s))
147147

148+
def test_len(self):
149+
s = 'hello'
150+
self.assertEqual(len(reversed(s)), len(s))
151+
148152
def test_main(verbose=None):
149153
testclasses = (EnumerateTestCase, SubclassTestCase, TestEmpty, TestBig,
150154
TestReversed)

Objects/enumobject.c

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

233+
static int
234+
reversed_len(reversedobject *ro)
235+
{
236+
return PyObject_Size(ro->seq);
237+
}
238+
233239
static PyObject *
234240
reversed_reverse(reversedobject *ro, PyObject *unused)
235241
{
@@ -244,6 +250,12 @@ PyDoc_STRVAR(reversed_doc,
244250
static PyMethodDef reversed_methods[] = {
245251
{"__reversed__", (PyCFunction)reversed_reverse,
246252
METH_NOARGS, reversed_doc},
253+
{NULL, NULL} /* sentinel */
254+
};
255+
256+
static PySequenceMethods reversed_as_sequence = {
257+
(inquiry)reversed_len, /* sq_length */
258+
0, /* sq_concat */
247259
};
248260

249261
PyTypeObject PyReversed_Type = {
@@ -260,7 +272,7 @@ PyTypeObject PyReversed_Type = {
260272
0, /* tp_compare */
261273
0, /* tp_repr */
262274
0, /* tp_as_number */
263-
0, /* tp_as_sequence */
275+
&reversed_as_sequence, /* tp_as_sequence */
264276
0, /* tp_as_mapping */
265277
0, /* tp_hash */
266278
0, /* tp_call */

0 commit comments

Comments
 (0)