:const:`False`. On reading, the *escapechar* removes any special meaning from
the following character. It defaults to :const:`None`, which disables escaping.
+ .. versionchanged:: 3.11
+ An empty *escapechar* is not allowed.
.. attribute:: Dialect.lineterminator
as the *delimiter* or *quotechar*, or which contain new-line characters. It
defaults to ``'"'``.
+ .. versionchanged:: 3.11
+ An empty *quotechar* is not allowed.
.. attribute:: Dialect.quoting
quoting=csv.QUOTE_ALL, quotechar='')
self.assertRaises(TypeError, ctor, arg,
quoting=csv.QUOTE_ALL, quotechar=None)
+ self.assertRaises(TypeError, ctor, arg,
+ quoting=csv.QUOTE_NONE, quotechar='')
def test_reader_arg_valid(self):
self._test_arg_valid(csv.reader, [])
self._read_test(['a,^b,c'], [['a', 'b', 'c']], escapechar='^')
self._read_test(['a,\0b,c'], [['a', 'b', 'c']], escapechar='\0')
self._read_test(['a,\\b,c'], [['a', '\\b', 'c']], escapechar=None)
- self._read_test(['a,\\b,c'], [['a', '\\b', 'c']], escapechar='')
self._read_test(['a,\\b,c'], [['a', '\\b', 'c']])
def test_read_quoting(self):
self.assertEqual(d.quotechar, '"')
self.assertTrue(d.doublequote)
+ mydialect.quotechar = ""
+ with self.assertRaises(csv.Error) as cm:
+ mydialect()
+ self.assertEqual(str(cm.exception),
+ '"quotechar" must be a 1-character string')
+
mydialect.quotechar = "''"
with self.assertRaises(csv.Error) as cm:
mydialect()
d = mydialect()
self.assertEqual(d.escapechar, "\\")
+ mydialect.escapechar = ""
+ with self.assertRaisesRegex(csv.Error, '"escapechar" must be a 1-character string'):
+ mydialect()
+
mydialect.escapechar = "**"
with self.assertRaisesRegex(csv.Error, '"escapechar" must be a 1-character string'):
mydialect()
if (len < 0) {
return -1;
}
- if (len > 1) {
+ if (len != 1) {
PyErr_Format(PyExc_TypeError,
"\"%s\" must be a 1-character string",
name);
return -1;
}
/* PyUnicode_READY() is called in PyUnicode_GetLength() */
- else if (len > 0) {
- *target = PyUnicode_READ_CHAR(src, 0);
- }
+ *target = PyUnicode_READ_CHAR(src, 0);
}
}
return 0;
*target = dflt;
}
else {
- *target = NOT_SET;
if (!PyUnicode_Check(src)) {
PyErr_Format(PyExc_TypeError,
"\"%s\" must be string, not %.200s", name,
if (len < 0) {
return -1;
}
- if (len > 1) {
+ if (len != 1) {
PyErr_Format(PyExc_TypeError,
"\"%s\" must be a 1-character string",
name);
return -1;
}
/* PyUnicode_READY() is called in PyUnicode_GetLength() */
- else if (len > 0) {
- *target = PyUnicode_READ_CHAR(src, 0);
- }
+ *target = PyUnicode_READ_CHAR(src, 0);
}
return 0;
}