From eaef61511656071194565878dc80c46096d46415 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sat, 2 Aug 2003 07:42:57 +0000 Subject: As discussed on python-dev, changed builtin.zip() to handle zero arguments by returning an empty list instead of raising a TypeError. --- Doc/lib/libfuncs.tex | 12 ++++++++---- Lib/test/test_builtin.py | 3 ++- Lib/test/test_iter.py | 5 ++++- Misc/NEWS | 3 +++ Python/bltinmodule.c | 8 +++----- 5 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Doc/lib/libfuncs.tex b/Doc/lib/libfuncs.tex index b9dc4e1..2f1ffff 100644 --- a/Doc/lib/libfuncs.tex +++ b/Doc/lib/libfuncs.tex @@ -1063,14 +1063,18 @@ It's a function when the loop is usually terminated with \keyword{break}). \end{funcdesc} -\begin{funcdesc}{zip}{seq1, \moreargs} +\begin{funcdesc}{zip}{\optional{seq1, \moreargs}} This function returns a list of tuples, where the \var{i}-th tuple contains - the \var{i}-th element from each of the argument sequences. At - least one sequence is required, otherwise a \exception{TypeError} is - raised. The returned list is truncated in length to the length of + the \var{i}-th element from each of the argument sequences. + The returned list is truncated in length to the length of the shortest argument sequence. When there are multiple argument sequences which are all of the same length, \function{zip()} is similar to \function{map()} with an initial argument of \code{None}. With a single sequence argument, it returns a list of 1-tuples. + With no arguments, it returns an empty list. \versionadded{2.0} + + \versionchanged[Formerly, \function{zip()} required at least one argument + and \code{zip()} raised a \exception{TypeError} instead of returning + \code{[]}]{2.4} \end{funcdesc} diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index 3dd2ffc..65dabb1 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -1126,7 +1126,8 @@ class BuiltinTest(unittest.TestCase): if i < 0 or i > 2: raise IndexError return i + 4 self.assertEqual(zip(a, I()), t) - self.assertRaises(TypeError, zip) + self.assertEqual(zip(), []) + self.assertEqual(zip(*[]), []) self.assertRaises(TypeError, zip, None) class G: pass diff --git a/Lib/test/test_iter.py b/Lib/test/test_iter.py index 383fce3..f83de78 100644 --- a/Lib/test/test_iter.py +++ b/Lib/test/test_iter.py @@ -423,7 +423,10 @@ class TestCase(unittest.TestCase): # Test zip()'s use of iterators. def test_builtin_zip(self): - self.assertRaises(TypeError, zip) + self.assertEqual(zip(), []) + self.assertEqual(zip(*[]), []) + self.assertEqual(zip(*[(1, 2), 'ab']), [(1, 'a'), (2, 'b')]) + self.assertRaises(TypeError, zip, None) self.assertRaises(TypeError, zip, range(10), 42) self.assertRaises(TypeError, zip, range(10), zip) diff --git a/Misc/NEWS b/Misc/NEWS index caf49b0..435dd64 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -12,6 +12,9 @@ What's New in Python 2.4 alpha 1? Core and builtins ----------------- +- zip() with no arguments now returns an empty list instead of raising + a TypeError exception. + Extension modules ----------------- diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 49fcc09..fb92478 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -1916,11 +1916,9 @@ builtin_zip(PyObject *self, PyObject *args) PyObject *itlist; /* tuple of iterators */ int len; /* guess at result length */ - if (itemsize < 1) { - PyErr_SetString(PyExc_TypeError, - "zip() requires at least one sequence"); - return NULL; - } + if (itemsize == 0) + return PyList_New(0); + /* args must be a tuple */ assert(PyTuple_Check(args)); -- cgit v0.12