From: Raymond Hettinger Date: Wed, 7 May 2003 01:28:47 +0000 (+0000) Subject: SF bug #730296: Unexpected Changes in list Iterator X-Git-Tag: v2.3c1~821 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=686b14d7ad700cfb3d3f0538695f0aa8e6c1b0b8;p=thirdparty%2FPython%2Fcpython.git 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. --- diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py index 7e238df3e0ae..153229570858 100644 --- a/Lib/test/test_types.py +++ b/Lib/test/test_types.py @@ -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' diff --git a/Misc/NEWS b/Misc/NEWS index 9f982dbfbbc2..98feacc8a15c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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 ----------------- diff --git a/Objects/listobject.c b/Objects/listobject.c index 36bbe22179d6..48f3d7d6ea01 100644 --- a/Objects/listobject.c +++ b/Objects/listobject.c @@ -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; diff --git a/Objects/tupleobject.c b/Objects/tupleobject.c index 7456533ccd4b..282da3e8b97b 100644 --- a/Objects/tupleobject.c +++ b/Objects/tupleobject.c @@ -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;