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().
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
index a16d140..d421be0 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -14,6 +14,12 @@
from textwrap import dedent
from collections import OrderedDict
+
+class BadIterable:
+ def __iter__(self):
+ raise OSError
+
+
class Test_Csv(unittest.TestCase):
"""
Test the underlying C csv parser in ways that are not appropriate
@@ -40,9 +46,15 @@
def test_reader_arg_valid(self):
self._test_arg_valid(csv.reader, [])
+ self.assertRaises(OSError, csv.reader, BadIterable())
def test_writer_arg_valid(self):
self._test_arg_valid(csv.writer, StringIO())
+ class BadWriter:
+ @property
+ def write(self):
+ raise OSError
+ self.assertRaises(OSError, csv.writer, BadWriter())
def _test_default_attrs(self, ctor, *args):
obj = ctor(*args)
@@ -141,6 +153,7 @@
self._write_test([None], '""')
self._write_error_test(csv.Error, [None], quoting = csv.QUOTE_NONE)
# Check that exceptions are passed up the chain
+ self._write_error_test(OSError, BadIterable())
class BadList:
def __len__(self):
return 10;
@@ -230,6 +243,12 @@
fileobj.seek(0)
self.assertEqual(fileobj.read(), 'a\r\n""\r\n')
+ def test_writerows_errors(self):
+ with TemporaryFile("w+", newline='') as fileobj:
+ writer = csv.writer(fileobj)
+ self.assertRaises(TypeError, writer.writerows, None)
+ self.assertRaises(OSError, writer.writerows, BadIterable())
+
@support.cpython_only
def test_writerows_legacy_strings(self):
import _testcapi
@@ -334,7 +353,6 @@
def test_roundtrip_quoteed_newlines(self):
with TemporaryFile("w+", newline='') as fileobj:
writer = csv.writer(fileobj)
- self.assertRaises(TypeError, writer.writerows, None)
rows = [['a\nb','b'],['c','x\r\nd']]
writer.writerows(rows)
fileobj.seek(0)