SF bug 665835: filter() treatment of str and tuple inconsistent
As a side issue on this bug, it was noted that list and tuple iterators
used macros to directly access containers and would not recognize
__getitem__ overrides. If the method is overridden, the patch returns
a generic sequence iterator which calls the __getitem__ method; otherwise,
it returns a high custom iterator with direct access to container elements.
diff --git a/Objects/listobject.c b/Objects/listobject.c
index 047c6ec..ae2b549 100644
--- a/Objects/listobject.c
+++ b/Objects/listobject.c
@@ -2375,6 +2375,8 @@
PyErr_BadInternalCall();
return NULL;
}
+ if (seq->ob_type->tp_as_sequence->sq_item != list_item)
+ return PySeqIter_New(seq);
it = PyObject_GC_New(listiterobject, &PyListIter_Type);
if (it == NULL)
return NULL;
diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c
index 282da3e..645480c 100644
--- a/Objects/tupleobject.c
+++ b/Objects/tupleobject.c
@@ -753,6 +753,8 @@
PyErr_BadInternalCall();
return NULL;
}
+ if (seq->ob_type->tp_as_sequence->sq_item != tupleitem)
+ return PySeqIter_New(seq);
it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
if (it == NULL)
return NULL;