From: Raymond Hettinger Date: Sat, 30 Aug 2003 22:16:59 +0000 (+0000) Subject: * Add news item for the previous bugfix X-Git-Tag: v2.3.1~119 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9ea45c88daa63363962506b9a3499f23e55675a4;p=thirdparty%2FPython%2Fcpython.git * Add news item for the previous bugfix * Backport itertoolsmodule.c 1.19 to re-sync Py2.3.1 with Py2.4. --- diff --git a/Doc/lib/libitertools.tex b/Doc/lib/libitertools.tex index 30fa60b685a0..aa9a02db4993 100644 --- a/Doc/lib/libitertools.tex +++ b/Doc/lib/libitertools.tex @@ -226,10 +226,13 @@ by functions or loops that truncate the stream. \begin{verbatim} def izip(*iterables): iterables = map(iter, iterables) - while True: + while iterables: result = [i.next() for i in iterables] yield tuple(result) \end{verbatim} + + \versionchanged[When no iterables are specified, returns a zero length + iterator instead of raising a TypeError exception]{2.3.1} \end{funcdesc} \begin{funcdesc}{repeat}{object\optional{, times}} diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py index 705965020635..057b576e49de 100644 --- a/Lib/test/test_itertools.py +++ b/Lib/test/test_itertools.py @@ -87,7 +87,7 @@ class TestBasicOps(unittest.TestCase): self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3))) self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3))) self.assertEqual(list(izip('abcdef')), zip('abcdef')) - self.assertRaises(TypeError, izip) + self.assertEqual(list(izip()), zip()) self.assertRaises(TypeError, izip, 3) self.assertRaises(TypeError, izip, range(3), 3) # Check tuple re-use (implementation detail) @@ -199,6 +199,8 @@ class TestBasicOps(unittest.TestCase): self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next) def test_StopIteration(self): + self.assertRaises(StopIteration, izip().next) + for f in (chain, cycle, izip): self.assertRaises(StopIteration, f([]).next) self.assertRaises(StopIteration, f(StopNow()).next) @@ -501,15 +503,19 @@ Samuele >>> def all(pred, seq): ... "Returns True if pred(x) is True for every element in the iterable" -... return not nth(ifilterfalse(pred, seq), 0) +... return False not in imap(pred, seq) >>> def some(pred, seq): ... "Returns True if pred(x) is True for at least one element in the iterable" -... return bool(nth(ifilter(pred, seq), 0)) +... return True in imap(pred, seq) >>> def no(pred, seq): ... "Returns True if pred(x) is False for every element in the iterable" -... return not nth(ifilter(pred, seq), 0) +... return True not in imap(pred, seq) + +>>> def quantify(pred, seq): +... "Count how many times the predicate is True in the sequence" +... return sum(imap(pred, seq)) >>> def padnone(seq): ... "Returns the sequence elements and then returns None indefinitely" @@ -566,6 +572,9 @@ True >>> no(lambda x: x%2==0, [1, 2, 5, 9]) False +>>> quantify(lambda x: x%2==0, xrange(99)) +50 + >>> list(window('abc')) [('a', 'b'), ('b', 'c')] diff --git a/Misc/NEWS b/Misc/NEWS index b682c27af227..fff30e6a150e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -21,7 +21,9 @@ Extension modules ----------------- - Bug #793826: re-ordered the reference counting code in - itertools.izip() to prevent re-entrancy anomalies. + itertools.izip() to prevent re-entrancy anomalies. Also, + if given zero arguments, it now returns an empty iterator + rather than raising a type error. - Bug #770485: cStringIO did not support the f.closed attribute. diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c index de7939d6fb9f..68e176f23d4e 100644 --- a/Modules/itertoolsmodule.c +++ b/Modules/itertoolsmodule.c @@ -1510,12 +1510,6 @@ izip_new(PyTypeObject *type, PyObject *args, PyObject *kwds) PyObject *result; int tuplesize = PySequence_Length(args); - if (tuplesize < 1) { - PyErr_SetString(PyExc_TypeError, - "izip() requires at least one sequence"); - return NULL; - } - /* args must be a tuple */ assert(PyTuple_Check(args)); @@ -1599,6 +1593,8 @@ izip_next(izipobject *lz) PyObject *item; PyObject *olditem; + if (tuplesize == 0) + return NULL; if (result->ob_refcnt == 1) { Py_INCREF(result); for (i=0 ; i < tuplesize ; i++) {