summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Peterson <benjamin@python.org>2009-05-09 17:23:03 (GMT)
committerBenjamin Peterson <benjamin@python.org>2009-05-09 17:23:03 (GMT)
commit784d45506670ce86d857ee118f0f64a2b667d386 (patch)
tree63b6f97b30b228e83c6b62ff4a4f6fd5c86ff5e3
parent0a32f9c448a7d0fb29f2e6f4df26a2019498c45e (diff)
downloadcpython-784d45506670ce86d857ee118f0f64a2b667d386.zip
cpython-784d45506670ce86d857ee118f0f64a2b667d386.tar.gz
cpython-784d45506670ce86d857ee118f0f64a2b667d386.tar.bz2
*sigh* deal with instances correctly
-rw-r--r--Lib/test/test_enumerate.py6
-rw-r--r--Objects/enumobject.c13
2 files changed, 18 insertions, 1 deletions
diff --git a/Lib/test/test_enumerate.py b/Lib/test/test_enumerate.py
index 074179c..d8a3251 100644
--- a/Lib/test/test_enumerate.py
+++ b/Lib/test/test_enumerate.py
@@ -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)))
diff --git a/Objects/enumobject.c b/Objects/enumobject.c
index 12a226c..65d4633 100644
--- a/Objects/enumobject.c
+++ b/Objects/enumobject.c
@@ -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);