[Python-checkins] r72512 - in python/trunk: Lib/test/test_enumerate.py Objects/enumobject.c
benjamin.peterson
python-checkins at python.org
Sat May 9 19:23:03 CEST 2009
Author: benjamin.peterson
Date: Sat May 9 19:23:03 2009
New Revision: 72512
Log:
*sigh* deal with instances correctly
Modified:
python/trunk/Lib/test/test_enumerate.py
python/trunk/Objects/enumobject.c
Modified: python/trunk/Lib/test/test_enumerate.py
==============================================================================
--- python/trunk/Lib/test/test_enumerate.py (original)
+++ python/trunk/Lib/test/test_enumerate.py Sat May 9 19:23:03 2009
@@ -141,6 +141,12 @@
# don't allow keyword arguments
self.assertRaises(TypeError, reversed, [], a=1)
+ def test_class_class(self):
+ class A:
+ def __reversed__(self):
+ return [2, 1]
+ self.assertEqual(list(reversed(A())), [2, 1])
+
def test_xrange_optimization(self):
x = xrange(1)
self.assertEqual(type(reversed(x)), type(iter(x)))
Modified: python/trunk/Objects/enumobject.c
==============================================================================
--- python/trunk/Objects/enumobject.c (original)
+++ python/trunk/Objects/enumobject.c Sat May 9 19:23:03 2009
@@ -232,7 +232,18 @@
if (!PyArg_UnpackTuple(args, "reversed", 1, 1, &seq) )
return NULL;
- reversed_meth = _PyObject_LookupSpecial(seq, "__reversed__", &reversed_cache);
+ if (PyInstance_Check(seq)) {
+ reversed_meth = PyObject_GetAttrString(seq, "__reversed__");
+ if (reversed_meth == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_AttributeError))
+ PyErr_Clear();
+ else
+ return NULL;
+ }
+ }
+ else
+ reversed_meth = _PyObject_LookupSpecial(seq, "__reversed__",
+ &reversed_cache);
if (reversed_meth != NULL) {
PyObject *res = PyObject_CallFunctionObjArgs(reversed_meth, NULL);
Py_DECREF(reversed_meth);
More information about the Python-checkins
mailing list