summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2003-08-02 07:42:57 (GMT)
committerRaymond Hettinger <python@rcn.com>2003-08-02 07:42:57 (GMT)
commiteaef61511656071194565878dc80c46096d46415 (patch)
treeb3e761f4c79ace0c0baeeb3ed845afd14ca666bb
parent9463792c686c312dcf85c649b7183eae25403945 (diff)
downloadcpython-eaef61511656071194565878dc80c46096d46415.zip
cpython-eaef61511656071194565878dc80c46096d46415.tar.gz
cpython-eaef61511656071194565878dc80c46096d46415.tar.bz2
As discussed on python-dev, changed builtin.zip() to handle zero arguments
by returning an empty list instead of raising a TypeError.
-rw-r--r--Doc/lib/libfuncs.tex12
-rw-r--r--Lib/test/test_builtin.py3
-rw-r--r--Lib/test/test_iter.py5
-rw-r--r--Misc/NEWS3
-rw-r--r--Python/bltinmodule.c8
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));