diff -r 6b28bfff9204 Lib/test/test_csv.py --- a/Lib/test/test_csv.py Mon Aug 26 01:33:30 2013 +0300 +++ b/Lib/test/test_csv.py Mon Aug 26 10:00:37 2013 +0800 @@ -759,22 +759,6 @@ 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,16 @@ mydialect.lineterminator = 4 self.assertRaises(csv.Error, mydialect) + def test_invaliddelimiter(self): + for dlmtr in (b",", ":::", 4): + class mydialect(csv.Dialect): + delimiter = dlmtr + + with self.assertRaises(csv.Error) as cm: + mydialect() + self.assertEqual(str(cm.exception), + '"delimiter" must be an 1-character string') + class TestSniffer(unittest.TestCase): sample1 = """\ diff -r 6b28bfff9204 Modules/_csv.c --- a/Modules/_csv.c Mon Aug 26 01:33:30 2013 +0300 +++ b/Modules/_csv.c Mon Aug 26 10:00:37 2013 +0800 @@ -239,19 +239,21 @@ *target = '\0'; if (src != Py_None) { Py_ssize_t len; + if (!PyUnicode_Check(src)) + goto err; len = PyUnicode_GetLength(src); - if (len > 1) { - PyErr_Format(PyExc_TypeError, - "\"%s\" must be an 1-character string", - name); - return -1; - } + if (len > 1) + goto err; /* PyUnicode_READY() is called in PyUnicode_GetLength() */ if (len > 0) *target = PyUnicode_READ_CHAR(src, 0); } } return 0; +err: + PyErr_Format(PyExc_TypeError, + "\"%s\" must be an 1-character string", name); + return -1; } static int