summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSergey Fedoseev <fedoseev.sergey@gmail.com>2019-08-30 04:25:48 (GMT)
committerRaymond Hettinger <rhettinger@users.noreply.github.com>2019-08-30 04:25:48 (GMT)
commit6a650aaf7735e30636db2721247f317064c2cfd4 (patch)
treecab175d9090dacfb5183ac30abf3339e6e3e7489
parent496058f59937da478eb172c864502b5dcf67705b (diff)
downloadcpython-6a650aaf7735e30636db2721247f317064c2cfd4.zip
cpython-6a650aaf7735e30636db2721247f317064c2cfd4.tar.gz
cpython-6a650aaf7735e30636db2721247f317064c2cfd4.tar.bz2
bpo-37976: Prevent shadowing of TypeError in zip() (GH-15592)
-rw-r--r--Lib/test/test_builtin.py12
-rw-r--r--Lib/test/test_itertools.py12
-rw-r--r--Modules/itertoolsmodule.c4
-rw-r--r--Python/bltinmodule.c4
4 files changed, 24 insertions, 8 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index 6115579..1100c49 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -1477,6 +1477,18 @@ class BuiltinTest(unittest.TestCase):
z1 = zip(a, b)
self.check_iter_pickle(z1, t, proto)
+ def test_zip_bad_iterable(self):
+ exception = TypeError()
+
+ class BadIterable:
+ def __iter__(self):
+ raise exception
+
+ with self.assertRaises(TypeError) as cm:
+ zip(BadIterable())
+
+ self.assertIs(cm.exception, exception)
+
def test_format(self):
# Test the basic machinery of the format() builtin. Don't test
# the specifics of the various formatters
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py
index 573739f..98b8c83 100644
--- a/Lib/test/test_itertools.py
+++ b/Lib/test/test_itertools.py
@@ -971,6 +971,18 @@ class TestBasicOps(unittest.TestCase):
self.pickletest(proto, zip_longest("abc", "defgh", fillvalue=1))
self.pickletest(proto, zip_longest("", "defgh"))
+ def test_zip_longest_bad_iterable(self):
+ exception = TypeError()
+
+ class BadIterable:
+ def __iter__(self):
+ raise exception
+
+ with self.assertRaises(TypeError) as cm:
+ zip_longest(BadIterable())
+
+ self.assertIs(cm.exception, exception)
+
def test_bug_7244(self):
class Repeater:
diff --git a/Modules/itertoolsmodule.c b/Modules/itertoolsmodule.c
index 101addc..ab473e2 100644
--- a/Modules/itertoolsmodule.c
+++ b/Modules/itertoolsmodule.c
@@ -4442,10 +4442,6 @@ zip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject *item = PyTuple_GET_ITEM(args, i);
PyObject *it = PyObject_GetIter(item);
if (it == NULL) {
- if (PyErr_ExceptionMatches(PyExc_TypeError))
- PyErr_Format(PyExc_TypeError,
- "zip_longest argument #%zd must support iteration",
- i+1);
Py_DECREF(ittuple);
return NULL;
}
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 7f187ea..63e5812 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -2548,10 +2548,6 @@ zip_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
PyObject *item = PyTuple_GET_ITEM(args, i);
PyObject *it = PyObject_GetIter(item);
if (it == NULL) {
- if (PyErr_ExceptionMatches(PyExc_TypeError))
- PyErr_Format(PyExc_TypeError,
- "zip argument #%zd must support iteration",
- i+1);
Py_DECREF(ittuple);
return NULL;
}