]> granicus.if.org Git - python/commitdiff
*sigh* deal with instances correctly
authorBenjamin Peterson <benjamin@python.org>
Sat, 9 May 2009 17:23:03 +0000 (17:23 +0000)
committerBenjamin Peterson <benjamin@python.org>
Sat, 9 May 2009 17:23:03 +0000 (17:23 +0000)
Lib/test/test_enumerate.py
Objects/enumobject.c

index 074179cfe0d00a92a968f9b73802e97416512da8..d8a32518856d5d796882da455ece0cb10513b73b 100644 (file)
@@ -141,6 +141,12 @@ class TestReversed(unittest.TestCase):
         # 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)))
index 12a226c74836de9a5d8d62eec88e9c0432436138..65d46334cf81c7c36d6e61810cbe2a3377022438 100644 (file)
@@ -232,7 +232,18 @@ reversed_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
        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);