Modified itertools.izip() to match the behavior of __builtin__.zip()

which can now take zero arguments.
This commit is contained in:
Raymond Hettinger 2003-08-08 05:10:41 +00:00
parent 77fe69bd08
commit b5a420883c
4 changed files with 15 additions and 8 deletions

View File

@ -226,10 +226,13 @@ by functions or loops that truncate the stream.
\begin{verbatim} \begin{verbatim}
def izip(*iterables): def izip(*iterables):
iterables = map(iter, iterables) iterables = map(iter, iterables)
while True: while iterables:
result = [i.next() for i in iterables] result = [i.next() for i in iterables]
yield tuple(result) yield tuple(result)
\end{verbatim} \end{verbatim}
\versionchanged[When no iterables are specified, returns a zero length
iterator instead of raising a TypeError exception]{2.4}
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{repeat}{object\optional{, times}} \begin{funcdesc}{repeat}{object\optional{, times}}

View File

@ -87,7 +87,7 @@ def test_izip(self):
self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3))) self.assertEqual(list(izip('abcdef', range(3))), zip('abcdef', range(3)))
self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3))) self.assertEqual(take(3,izip('abcdef', count())), zip('abcdef', range(3)))
self.assertEqual(list(izip('abcdef')), zip('abcdef')) 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, 3)
self.assertRaises(TypeError, izip, range(3), 3) self.assertRaises(TypeError, izip, range(3), 3)
# Check tuple re-use (implementation detail) # Check tuple re-use (implementation detail)
@ -199,6 +199,8 @@ def test_dropwhile(self):
self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next) self.assertRaises(ValueError, dropwhile(errfunc, [(4,5)]).next)
def test_StopIteration(self): def test_StopIteration(self):
self.assertRaises(StopIteration, izip().next)
for f in (chain, cycle, izip): for f in (chain, cycle, izip):
self.assertRaises(StopIteration, f([]).next) self.assertRaises(StopIteration, f([]).next)
self.assertRaises(StopIteration, f(StopNow()).next) self.assertRaises(StopIteration, f(StopNow()).next)
@ -540,6 +542,9 @@ def test_dropwhile(self):
>>> no(lambda x: x%2==0, [1, 2, 5, 9]) >>> no(lambda x: x%2==0, [1, 2, 5, 9])
False False
>>> quantify(lambda x: x%2==0, xrange(99))
50
>>> list(window('abc')) >>> list(window('abc'))
[('a', 'b'), ('b', 'c')] [('a', 'b'), ('b', 'c')]

View File

@ -23,6 +23,9 @@ Extension modules
Library Library
------- -------
- itertools.izip() with no arguments now returns an empty iterator instead
of raising a TypeError exception.
- _strptime.py now has a behind-the-scenes caching mechanism for the most - _strptime.py now has a behind-the-scenes caching mechanism for the most
recent TimeRE instance used along with the last five unique directive recent TimeRE instance used along with the last five unique directive
patterns. The overall module was also made more thread-safe. patterns. The overall module was also made more thread-safe.

View File

@ -1510,12 +1510,6 @@ izip_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject *result; PyObject *result;
int tuplesize = PySequence_Length(args); 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 */ /* args must be a tuple */
assert(PyTuple_Check(args)); assert(PyTuple_Check(args));
@ -1598,6 +1592,8 @@ izip_next(izipobject *lz)
PyObject *it; PyObject *it;
PyObject *item; PyObject *item;
if (tuplesize == 0)
return NULL;
if (result->ob_refcnt == 1) { if (result->ob_refcnt == 1) {
for (i=0 ; i < tuplesize ; i++) { for (i=0 ; i < tuplesize ; i++) {
it = PyTuple_GET_ITEM(lz->ittuple, i); it = PyTuple_GET_ITEM(lz->ittuple, i);