diff -r ac27d979078a Lib/test/test_csv.py --- a/Lib/test/test_csv.py Thu Sep 05 00:23:08 2013 +0200 +++ b/Lib/test/test_csv.py Thu Sep 05 17:20:42 2013 +0800 @@ -22,7 +22,7 @@ self.assertRaises(TypeError, ctor, None) self.assertRaises(TypeError, ctor, arg, bad_attr = 0) self.assertRaises(TypeError, ctor, arg, delimiter = 0) - self.assertRaises(TypeError, ctor, arg, delimiter = 'XX') + self.assertRaises(ValueError, ctor, arg, delimiter = 'XX') self.assertRaises(csv.Error, ctor, arg, 'foo') self.assertRaises(TypeError, ctor, arg, delimiter=None) self.assertRaises(TypeError, ctor, arg, delimiter=1) @@ -754,27 +754,11 @@ d = mydialect() mydialect.quotechar = "''" - self.assertRaises(csv.Error, mydialect) + self.assertRaises(ValueError, mydialect) mydialect.quotechar = 4 self.assertRaises(csv.Error, mydialect) - def test_delimiter(self): - class mydialect(csv.Dialect): - delimiter = ";" - escapechar = '\\' - doublequote = False - skipinitialspace = True - lineterminator = '\r\n' - quoting = csv.QUOTE_NONE - d = mydialect() - - mydialect.delimiter = ":::" - self.assertRaises(csv.Error, mydialect) - - mydialect.delimiter = 4 - self.assertRaises(csv.Error, mydialect) - def test_lineterminator(self): class mydialect(csv.Dialect): delimiter = ";" @@ -791,6 +775,22 @@ mydialect.lineterminator = 4 self.assertRaises(csv.Error, mydialect) + def test_invaliddelimiter(self): + class mydialect(csv.Dialect): + delimiter = b"," + + with self.assertRaises(csv.Error) as cm: + mydialect() + self.assertEqual(str(cm.exception), + '"delimiter" must be string, not bytes') + + mydialect.delimiter = 4 + + with self.assertRaises(csv.Error) as cm: + mydialect() + self.assertEqual(str(cm.exception), + '"delimiter" must be string, not int') + class TestSniffer(unittest.TestCase): sample1 = """\ diff -r ac27d979078a Modules/_csv.c --- a/Modules/_csv.c Thu Sep 05 00:23:08 2013 +0200 +++ b/Modules/_csv.c Thu Sep 05 17:20:42 2013 +0800 @@ -239,11 +239,16 @@ *target = '\0'; if (src != Py_None) { Py_ssize_t len; + if (!PyUnicode_Check(src)) { + PyErr_Format(PyExc_TypeError, + "\"%s\" must be string, not %s", name, + src->ob_type->tp_name); + return -1; + } len = PyUnicode_GetLength(src); if (len > 1) { - PyErr_Format(PyExc_TypeError, - "\"%s\" must be an 1-character string", - name); + PyErr_Format(PyExc_ValueError, + "\"%s\" must be an 1-character string", name); return -1; } /* PyUnicode_READY() is called in PyUnicode_GetLength() */