mirror of
https://github.com/python/cpython.git
synced 2025-09-22 08:23:36 +00:00
bpo-37976: Prevent shadowing of TypeError in zip() (GH-15592) (GH-15608)
(cherry picked from commit 6a650aaf77
)
Co-authored-by: Sergey Fedoseev <fedoseev.sergey@gmail.com>
This commit is contained in:
parent
c19d6bca55
commit
27f418640c
4 changed files with 24 additions and 8 deletions
|
@ -1477,6 +1477,18 @@ class BuiltinTest(unittest.TestCase):
|
||||||
z1 = zip(a, b)
|
z1 = zip(a, b)
|
||||||
self.check_iter_pickle(z1, t, proto)
|
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):
|
def test_format(self):
|
||||||
# Test the basic machinery of the format() builtin. Don't test
|
# Test the basic machinery of the format() builtin. Don't test
|
||||||
# the specifics of the various formatters
|
# the specifics of the various formatters
|
||||||
|
|
|
@ -971,6 +971,18 @@ class TestBasicOps(unittest.TestCase):
|
||||||
self.pickletest(proto, zip_longest("abc", "defgh", fillvalue=1))
|
self.pickletest(proto, zip_longest("abc", "defgh", fillvalue=1))
|
||||||
self.pickletest(proto, zip_longest("", "defgh"))
|
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):
|
def test_bug_7244(self):
|
||||||
|
|
||||||
class Repeater:
|
class Repeater:
|
||||||
|
|
|
@ -4434,10 +4434,6 @@ zip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
PyObject *item = PyTuple_GET_ITEM(args, i);
|
PyObject *item = PyTuple_GET_ITEM(args, i);
|
||||||
PyObject *it = PyObject_GetIter(item);
|
PyObject *it = PyObject_GetIter(item);
|
||||||
if (it == NULL) {
|
if (it == NULL) {
|
||||||
if (PyErr_ExceptionMatches(PyExc_TypeError))
|
|
||||||
PyErr_Format(PyExc_TypeError,
|
|
||||||
"zip_longest argument #%zd must support iteration",
|
|
||||||
i+1);
|
|
||||||
Py_DECREF(ittuple);
|
Py_DECREF(ittuple);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2549,10 +2549,6 @@ zip_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
PyObject *item = PyTuple_GET_ITEM(args, i);
|
PyObject *item = PyTuple_GET_ITEM(args, i);
|
||||||
PyObject *it = PyObject_GetIter(item);
|
PyObject *it = PyObject_GetIter(item);
|
||||||
if (it == NULL) {
|
if (it == NULL) {
|
||||||
if (PyErr_ExceptionMatches(PyExc_TypeError))
|
|
||||||
PyErr_Format(PyExc_TypeError,
|
|
||||||
"zip argument #%zd must support iteration",
|
|
||||||
i+1);
|
|
||||||
Py_DECREF(ittuple);
|
Py_DECREF(ittuple);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue