summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Lib/csv.py76
-rw-r--r--Lib/test/test_csv.py3
-rw-r--r--Misc/NEWS.d/next/Documentation/2024-01-17-11-40-03.gh-issue-114123.LuueXf.rst7
-rw-r--r--Modules/_csv.c71
4 files changed, 78 insertions, 79 deletions
diff --git a/Lib/csv.py b/Lib/csv.py
index 77f30c8..a079279 100644
--- a/Lib/csv.py
+++ b/Lib/csv.py
@@ -1,28 +1,90 @@
-"""
-csv.py - read/write/investigate CSV files
+r"""
+CSV parsing and writing.
+
+This module provides classes that assist in the reading and writing
+of Comma Separated Value (CSV) files, and implements the interface
+described by PEP 305. Although many CSV files are simple to parse,
+the format is not formally defined by a stable specification and
+is subtle enough that parsing lines of a CSV file with something
+like line.split(",") is bound to fail. The module supports three
+basic APIs: reading, writing, and registration of dialects.
+
+
+DIALECT REGISTRATION:
+
+Readers and writers support a dialect argument, which is a convenient
+handle on a group of settings. When the dialect argument is a string,
+it identifies one of the dialects previously registered with the module.
+If it is a class or instance, the attributes of the argument are used as
+the settings for the reader or writer:
+
+ class excel:
+ delimiter = ','
+ quotechar = '"'
+ escapechar = None
+ doublequote = True
+ skipinitialspace = False
+ lineterminator = '\r\n'
+ quoting = QUOTE_MINIMAL
+
+SETTINGS:
+
+ * quotechar - specifies a one-character string to use as the
+ quoting character. It defaults to '"'.
+ * delimiter - specifies a one-character string to use as the
+ field separator. It defaults to ','.
+ * skipinitialspace - specifies how to interpret spaces which
+ immediately follow a delimiter. It defaults to False, which
+ means that spaces immediately following a delimiter is part
+ of the following field.
+ * lineterminator - specifies the character sequence which should
+ terminate rows.
+ * quoting - controls when quotes should be generated by the writer.
+ It can take on any of the following module constants:
+
+ csv.QUOTE_MINIMAL means only when required, for example, when a
+ field contains either the quotechar or the delimiter
+ csv.QUOTE_ALL means that quotes are always placed around fields.
+ csv.QUOTE_NONNUMERIC means that quotes are always placed around
+ fields which do not parse as integers or floating point
+ numbers.
+ csv.QUOTE_STRINGS means that quotes are always placed around
+ fields which are strings. Note that the Python value None
+ is not a string.
+ csv.QUOTE_NOTNULL means that quotes are only placed around fields
+ that are not the Python value None.
+ csv.QUOTE_NONE means that quotes are never placed around fields.
+ * escapechar - specifies a one-character string used to escape
+ the delimiter when quoting is set to QUOTE_NONE.
+ * doublequote - controls the handling of quotes inside fields. When
+ True, two consecutive quotes are interpreted as one during read,
+ and when writing, each quote character embedded in the data is
+ written as two quotes
"""
import re
import types
-from _csv import Error, __version__, writer, reader, register_dialect, \
+from _csv import Error, writer, reader, register_dialect, \
unregister_dialect, get_dialect, list_dialects, \
field_size_limit, \
QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE, \
- QUOTE_STRINGS, QUOTE_NOTNULL, \
- __doc__
+ QUOTE_STRINGS, QUOTE_NOTNULL
from _csv import Dialect as _Dialect
from io import StringIO
__all__ = ["QUOTE_MINIMAL", "QUOTE_ALL", "QUOTE_NONNUMERIC", "QUOTE_NONE",
"QUOTE_STRINGS", "QUOTE_NOTNULL",
- "Error", "Dialect", "__doc__", "excel", "excel_tab",
+ "Error", "Dialect", "excel", "excel_tab",
"field_size_limit", "reader", "writer",
"register_dialect", "get_dialect", "list_dialects", "Sniffer",
- "unregister_dialect", "__version__", "DictReader", "DictWriter",
+ "unregister_dialect", "DictReader", "DictWriter",
"unix_dialect"]
+__version__ = "1.0"
+
+
class Dialect:
"""Describe a CSV dialect.
diff --git a/Lib/test/test_csv.py b/Lib/test/test_csv.py
index 282cff4..36da86e 100644
--- a/Lib/test/test_csv.py
+++ b/Lib/test/test_csv.py
@@ -1416,8 +1416,7 @@ class KeyOrderingTest(unittest.TestCase):
class MiscTestCase(unittest.TestCase):
def test__all__(self):
- extra = {'__doc__', '__version__'}
- support.check__all__(self, csv, ('csv', '_csv'), extra=extra)
+ support.check__all__(self, csv, ('csv', '_csv'))
def test_subclassable(self):
# issue 44089
diff --git a/Misc/NEWS.d/next/Documentation/2024-01-17-11-40-03.gh-issue-114123.LuueXf.rst b/Misc/NEWS.d/next/Documentation/2024-01-17-11-40-03.gh-issue-114123.LuueXf.rst
new file mode 100644
index 0000000..1d93a42
--- /dev/null
+++ b/Misc/NEWS.d/next/Documentation/2024-01-17-11-40-03.gh-issue-114123.LuueXf.rst
@@ -0,0 +1,7 @@
+Move the :mod:`csv` module docstring to the :mod:`!csv` module
+instead of reexporting it from the internal :mod:`!_csv` module,
+and remove ``__doc__`` from ``csv.__all__``.
+
+Move :attr:`!csv.__version__` to the :mod:`!csv` module
+instead of reexporting it from the internal :mod:`!_csv` module,
+and remove ``__version__`` from ``csv.__all__``.
diff --git a/Modules/_csv.c b/Modules/_csv.c
index d45a15a..8d94156 100644
--- a/Modules/_csv.c
+++ b/Modules/_csv.c
@@ -8,8 +8,6 @@ module instead.
*/
-#define MODULE_VERSION "1.0"
-
// clinic/_csv.c.h uses internal pycore_modsupport.h API
#ifndef Py_BUILD_CORE_BUILTIN
# define Py_BUILD_CORE_MODULE 1
@@ -1607,68 +1605,7 @@ PyType_Spec error_spec = {
* MODULE
*/
-PyDoc_STRVAR(csv_module_doc,
-"CSV parsing and writing.\n"
-"\n"
-"This module provides classes that assist in the reading and writing\n"
-"of Comma Separated Value (CSV) files, and implements the interface\n"
-"described by PEP 305. Although many CSV files are simple to parse,\n"
-"the format is not formally defined by a stable specification and\n"
-"is subtle enough that parsing lines of a CSV file with something\n"
-"like line.split(\",\") is bound to fail. The module supports three\n"
-"basic APIs: reading, writing, and registration of dialects.\n"
-"\n"
-"\n"
-"DIALECT REGISTRATION:\n"
-"\n"
-"Readers and writers support a dialect argument, which is a convenient\n"
-"handle on a group of settings. When the dialect argument is a string,\n"
-"it identifies one of the dialects previously registered with the module.\n"
-"If it is a class or instance, the attributes of the argument are used as\n"
-"the settings for the reader or writer:\n"
-"\n"
-" class excel:\n"
-" delimiter = ','\n"
-" quotechar = '\"'\n"
-" escapechar = None\n"
-" doublequote = True\n"
-" skipinitialspace = False\n"
-" lineterminator = '\\r\\n'\n"
-" quoting = QUOTE_MINIMAL\n"
-"\n"
-"SETTINGS:\n"
-"\n"
-" * quotechar - specifies a one-character string to use as the\n"
-" quoting character. It defaults to '\"'.\n"
-" * delimiter - specifies a one-character string to use as the\n"
-" field separator. It defaults to ','.\n"
-" * skipinitialspace - specifies how to interpret spaces which\n"
-" immediately follow a delimiter. It defaults to False, which\n"
-" means that spaces immediately following a delimiter is part\n"
-" of the following field.\n"
-" * lineterminator - specifies the character sequence which should\n"
-" terminate rows.\n"
-" * quoting - controls when quotes should be generated by the writer.\n"
-" It can take on any of the following module constants:\n"
-"\n"
-" csv.QUOTE_MINIMAL means only when required, for example, when a\n"
-" field contains either the quotechar or the delimiter\n"
-" csv.QUOTE_ALL means that quotes are always placed around fields.\n"
-" csv.QUOTE_NONNUMERIC means that quotes are always placed around\n"
-" fields which do not parse as integers or floating point\n"
-" numbers.\n"
-" csv.QUOTE_STRINGS means that quotes are always placed around\n"
-" fields which are strings. Note that the Python value None\n"
-" is not a string.\n"
-" csv.QUOTE_NOTNULL means that quotes are only placed around fields\n"
-" that are not the Python value None.\n"
-" csv.QUOTE_NONE means that quotes are never placed around fields.\n"
-" * escapechar - specifies a one-character string used to escape\n"
-" the delimiter when quoting is set to QUOTE_NONE.\n"
-" * doublequote - controls the handling of quotes inside fields. When\n"
-" True, two consecutive quotes are interpreted as one during read,\n"
-" and when writing, each quote character embedded in the data is\n"
-" written as two quotes\n");
+PyDoc_STRVAR(csv_module_doc, "CSV parsing and writing.\n");
PyDoc_STRVAR(csv_reader_doc,
" csv_reader = reader(iterable [, dialect='excel']\n"
@@ -1741,12 +1678,6 @@ csv_exec(PyObject *module) {
return -1;
}
- /* Add version to the module. */
- if (PyModule_AddStringConstant(module, "__version__",
- MODULE_VERSION) == -1) {
- return -1;
- }
-
/* Set the field limit */
module_state->field_limit = 128 * 1024;