bpo-26407: Do not mask errors in csv. (GH-20536)
Unexpected errors in calling the __iter__ method are no longer
masked by TypeError in csv.reader(), csv.writer.writerow() and
csv.writer.writerows().
(cherry picked from commit c88239f864a27f673c0f0a9e62d2488563f9d081)
Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
diff --git a/Modules/_csv.c b/Modules/_csv.c
index 3a52632..59109b0 100644
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -964,8 +964,6 @@
}
self->input_iter = PyObject_GetIter(iterator);
if (self->input_iter == NULL) {
- PyErr_SetString(PyExc_TypeError,
- "argument 1 must be an iterator");
Py_DECREF(self);
return NULL;
}
@@ -1171,10 +1169,14 @@
PyObject *iter, *field, *line, *result;
iter = PyObject_GetIter(seq);
- if (iter == NULL)
- return PyErr_Format(_csvstate_global->error_obj,
- "iterable expected, not %.200s",
- Py_TYPE(seq)->tp_name);
+ if (iter == NULL) {
+ if (PyErr_ExceptionMatches(PyExc_TypeError)) {
+ PyErr_Format(_csvstate_global->error_obj,
+ "iterable expected, not %.200s",
+ Py_TYPE(seq)->tp_name);
+ }
+ return NULL;
+ }
/* Join all fields in internal buffer.
*/
@@ -1264,8 +1266,6 @@
row_iter = PyObject_GetIter(seqseq);
if (row_iter == NULL) {
- PyErr_SetString(PyExc_TypeError,
- "writerows() argument must be iterable");
return NULL;
}
while ((row_obj = PyIter_Next(row_iter))) {