Skip to content

Commit c97bc4f

Browse files
gh-155059: Make the delimiters parameter keyword-only
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 60767ec commit c97bc4f

3 files changed

Lines changed: 10 additions & 7 deletions

File tree

Doc/library/csv.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ The :mod:`!csv` module defines the following classes:
299299
.. versionadded:: 3.2
300300

301301

302-
.. class:: Sniffer(delimiters=None)
302+
.. class:: Sniffer(*, delimiters=None)
303303

304304
The :class:`Sniffer` class is used to deduce the format of a CSV file.
305305

Lib/csv.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ class Sniffer:
246246
# argument is not specified.
247247
delimiters = [c for c in map(chr, range(128)) if not c.isalnum()]
248248

249-
def __init__(self, delimiters=None):
249+
def __init__(self, *, delimiters=None):
250250
if delimiters is None:
251251
# in case there is more than one possible delimiter
252252
self.preferred = [',', '\t', ';', ' ', ':']

Lib/test/test_csv.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1505,13 +1505,14 @@ def test_delimiters(self):
15051505
self.assertEqual(dialect.quotechar, '"')
15061506

15071507
def test_delimiters_in_constructor(self):
1508-
dialect = csv.Sniffer("?,").sniff(self.sample3)
1508+
dialect = csv.Sniffer(delimiters="?,").sniff(self.sample3)
15091509
self.assertEqual(dialect.delimiter, "?")
15101510
dialect = csv.Sniffer(delimiters="/,").sniff(self.sample3)
15111511
self.assertEqual(dialect.delimiter, "/")
15121512
# The argument of sniff() takes precedence.
1513-
dialect = csv.Sniffer("/,").sniff(self.sample3, "?,")
1513+
dialect = csv.Sniffer(delimiters="/,").sniff(self.sample3, "?,")
15141514
self.assertEqual(dialect.delimiter, "?")
1515+
self.assertRaises(TypeError, csv.Sniffer, "?,")
15151516
# has_header() uses them as well.
15161517
sniffer = csv.Sniffer(delimiters=",")
15171518
self.assertIs(sniffer.has_header(self.header1 + self.sample1), True)
@@ -1524,10 +1525,12 @@ def test_preferred_in_constructor(self):
15241525
self.assertEqual(csv.Sniffer().sniff(sample).delimiter, ',')
15251526
# The delimiters given to the constructor are preferred in the
15261527
# given order.
1527-
self.assertEqual(csv.Sniffer(";,").sniff(sample).delimiter, ';')
1528-
self.assertEqual(csv.Sniffer(",;").sniff(sample).delimiter, ',')
1528+
sniffer = csv.Sniffer(delimiters=";,")
1529+
self.assertEqual(sniffer.sniff(sample).delimiter, ';')
1530+
self.assertEqual(csv.Sniffer(delimiters=",;").sniff(sample).delimiter,
1531+
',')
15291532
# The argument of sniff() does not affect the preference.
1530-
self.assertEqual(csv.Sniffer(";,").sniff(sample, ",;").delimiter, ';')
1533+
self.assertEqual(sniffer.sniff(sample, ",;").delimiter, ';')
15311534

15321535
def test_sniff_escapechar(self):
15331536
# gh-83273: escaped delimiters make the delimiter frequencies

0 commit comments

Comments
 (0)