From e6669e4f73cf7e31c3bc42c843c39fe18011e90f Mon Sep 17 00:00:00 2001 From: Stefan van der Walt Date: Tue, 20 Jan 2026 17:09:08 -0800 Subject: [PATCH] Remove spaces resulting from line continuation in arg type descriptor Closes gh-87 --- numpydoc/docscrape.py | 13 ++++++++++++- numpydoc/tests/test_docscrape.py | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/numpydoc/docscrape.py b/numpydoc/docscrape.py index 26a08259..c5f70234 100644 --- a/numpydoc/docscrape.py +++ b/numpydoc/docscrape.py @@ -222,12 +222,23 @@ def _read_sections(self): def _parse_param_list(self, content, single_element_is_type=False): content = dedent_lines(content) + r = Reader(content) params = [] while not r.eof(): header = r.read().strip() if " : " in header: - arg_name, arg_type = header.split(" : ", maxsplit=1) + arg_name, arg_type_w_whitespace = header.split(" : ", maxsplit=1) + N = len(arg_name) + + # This strips spaces that arose from + # backslash-continued lines. Unfortunately, we don't + # know the offset of the original docstring, and + # therefore also not the number of spaces introduced + # by the continued line. However, we can set a lower + # bound: length of the parameter, plus three (for + # space-colon-space). + arg_type = re.sub(rf" {{{N + 3},}}", " ", arg_type_w_whitespace) else: # NOTE: param line with single element should never have a # a " :" before the description line, so this should probably diff --git a/numpydoc/tests/test_docscrape.py b/numpydoc/tests/test_docscrape.py index acf5194c..465d4d95 100644 --- a/numpydoc/tests/test_docscrape.py +++ b/numpydoc/tests/test_docscrape.py @@ -207,6 +207,20 @@ def test_parameters(doc): assert desc[0].startswith("The type and size") +def test_type_continuation(): + doc = NumpyDocString(""" + Parameters + ---------- + foo : a type that goes across \ + multiple lines + This is the description line. + """) + arg, arg_type, desc = doc["Parameters"][0] + assert arg == "foo" + assert arg_type == "a type that goes across multiple lines" + assert desc[0] == "This is the description line." + + def test_other_parameters(doc): assert len(doc["Other Parameters"]) == 1 assert [n for n, _, _ in doc["Other Parameters"]] == ["spam"]