SF bug #730296: Unexpected Changes in list Iterator

Reverted a Py2.3b1 change to iterator in subclasses of list and tuple.
They had been changed to use __getitem__ whenever it had been overriden
in the subclass.

This caused some usabilty and performance problems.  Also, it was
inconsistent with the rest of python where many container methods
access the underlying object directly without first checking for
an overridden getter.  Users needing a change in iterator behavior
should override it directly.
This commit is contained in:
Raymond Hettinger 2003-05-07 01:28:47 +00:00
parent a409f7c491
commit 686b14d7ad
4 changed files with 9 additions and 8 deletions

View File

@ -256,11 +256,11 @@ def f():
yield i
vereq(list(tuple(f())), range(1000))
# Verify that __getitem__ overrides are recognized by __iter__
# Verify that __getitem__ overrides are not recognized by __iter__
class T(tuple):
def __getitem__(self, key):
return str(key) + '!!!'
vereq(iter(T()).next(), '0!!!')
vereq(iter(T((1,2))).next(), 1)
print '6.5.3 Lists'
# calling built-in types without argument must return empty
@ -453,11 +453,11 @@ a = range(10)
a[::2] = tuple(range(5))
vereq(a, [0, 1, 1, 3, 2, 5, 3, 7, 4, 9])
# Verify that __getitem__ overrides are recognized by __iter__
# Verify that __getitem__ overrides are not recognized by __iter__
class L(list):
def __getitem__(self, key):
return str(key) + '!!!'
vereq(iter(L()).next(), '0!!!')
vereq(iter(L([1,2])).next(), 1)
print '6.6 Mappings == Dictionaries'

View File

@ -15,6 +15,11 @@ Core and builtins
- The softspace attribute of file objects became read-only by oversight.
It's writable again.
- Reverted a 2.3 beta 1 change to iterators for subclasses of list and
tuple. By default, the iterators now access data elements directly
instead of going through __getitem__. If __getitem__ access is
preferred, then __iter__ can be overriden.
Extension modules
-----------------

View File

@ -2382,8 +2382,6 @@ list_iter(PyObject *seq)
PyErr_BadInternalCall();
return NULL;
}
if (seq->ob_type->tp_as_sequence->sq_item != (intargfunc)list_item)
return PySeqIter_New(seq);
it = PyObject_GC_New(listiterobject, &PyListIter_Type);
if (it == NULL)
return NULL;

View File

@ -753,8 +753,6 @@ tuple_iter(PyObject *seq)
PyErr_BadInternalCall();
return NULL;
}
if (seq->ob_type->tp_as_sequence->sq_item != (intargfunc)tupleitem)
return PySeqIter_New(seq);
it = PyObject_GC_New(tupleiterobject, &PyTupleIter_Type);
if (it == NULL)
return NULL;