Skip to content

Commit d8f1230

Browse files
committed
bpo-20028: Empty escapechar/quotechar is not allowed for csv.Dialect
1 parent b454e8e commit d8f1230

File tree

4 files changed

+18
-2
lines changed

4 files changed

+18
-2
lines changed

Doc/library/csv.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,8 @@ Dialects support the following attributes:
383383
:const:`False`. On reading, the *escapechar* removes any special meaning from
384384
the following character. It defaults to :const:`None`, which disables escaping.
385385

386+
.. versionchanged:: 3.11
387+
An empty *escapechar* is not allowed.
386388

387389
.. attribute:: Dialect.lineterminator
388390

@@ -402,6 +404,8 @@ Dialects support the following attributes:
402404
as the *delimiter* or *quotechar*, or which contain new-line characters. It
403405
defaults to ``'"'``.
404406

407+
.. versionchanged:: 3.11
408+
An empty *quotechar* is not allowed.
405409

406410
.. attribute:: Dialect.quoting
407411

Lib/test/test_csv.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,12 @@ class mydialect(csv.Dialect):
913913
self.assertEqual(d.quotechar, '"')
914914
self.assertTrue(d.doublequote)
915915

916+
mydialect.quotechar = ""
917+
with self.assertRaises(csv.Error) as cm:
918+
mydialect()
919+
self.assertEqual(str(cm.exception),
920+
'"quotechar" must be a 1-character string')
921+
916922
mydialect.quotechar = "''"
917923
with self.assertRaises(csv.Error) as cm:
918924
mydialect()
@@ -977,6 +983,10 @@ class mydialect(csv.Dialect):
977983
d = mydialect()
978984
self.assertEqual(d.escapechar, "\\")
979985

986+
mydialect.escapechar = ""
987+
with self.assertRaisesRegex(csv.Error, '"escapechar" must be a 1-character string'):
988+
mydialect()
989+
980990
mydialect.escapechar = "**"
981991
with self.assertRaisesRegex(csv.Error, '"escapechar" must be a 1-character string'):
982992
mydialect()
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Empty escapechar/quotechar is not allowed when initializing
2+
:class:`csv.Dialect`. Patch by Vajrasky Kok and Dong-hee Na.

Modules/_csv.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ _set_char_or_none(const char *name, Py_UCS4 *target, PyObject *src, Py_UCS4 dflt
250250
if (len < 0) {
251251
return -1;
252252
}
253-
if (len > 1) {
253+
if (len != 1) {
254254
PyErr_Format(PyExc_TypeError,
255255
"\"%s\" must be a 1-character string",
256256
name);
@@ -283,7 +283,7 @@ _set_char(const char *name, Py_UCS4 *target, PyObject *src, Py_UCS4 dflt)
283283
if (len < 0) {
284284
return -1;
285285
}
286-
if (len > 1) {
286+
if (len != 1) {
287287
PyErr_Format(PyExc_TypeError,
288288
"\"%s\" must be a 1-character string",
289289
name);

0 commit comments

Comments
 (0)