Skip to content

Commit 1668dd9

Browse files
authored
Correctly validate parameters under the "Other Parameters" section (#337)
* Fix invalid "PR01" error when parameter is specified in "Other Parameters" section. * Fix 'foo' docstring in doc/example.py * Change "PR03" (wrong parameters order) validation test * Revert "PR03" changes.
1 parent be70dd9 commit 1668dd9

File tree

3 files changed

+62
-20
lines changed

3 files changed

+62
-20
lines changed

doc/example.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
# numpy module itself, unabbreviated.
3636

3737

38-
def foo(var1, var2, *args, long_var_name='hi', **kwargs):
38+
def foo(var1, var2, *args, long_var_name='hi', only_seldom_used_keyword=0, **kwargs):
3939
r"""Summarize the function in one line.
4040
4141
Several sentences providing an extended description. Refer to
@@ -55,8 +55,6 @@ def foo(var1, var2, *args, long_var_name='hi', **kwargs):
5555
Other arguments.
5656
long_var_name : {'hi', 'ho'}, optional
5757
Choices in brackets, default first when optional.
58-
**kwargs : dict
59-
Keyword arguments.
6058
6159
Returns
6260
-------
@@ -70,10 +68,14 @@ def foo(var1, var2, *args, long_var_name='hi', **kwargs):
7068
7169
Other Parameters
7270
----------------
73-
only_seldom_used_keywords : type
74-
Explanation.
75-
common_parameters_listed_above : type
76-
Explanation.
71+
only_seldom_used_keyword : int, optional
72+
Infrequently used parameters can be described under this optional
73+
section to prevent cluttering the Parameters section.
74+
**kwargs : dict
75+
Other infrequently used keyword arguments. Note that all keyword
76+
arguments appearing after the first parameter specified under the
77+
Other Parameters section, should also be described under this
78+
section.
7779
7880
Raises
7981
------

numpydoc/tests/test_validate.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,33 @@ def multiple_variables_on_one_line(self, matrix, a, b, i, j):
431431
"""
432432
pass
433433

434+
def other_parameters(self, param1, param2):
435+
"""
436+
Ensure "Other Parameters" are recognized.
437+
438+
The second parameter is used infrequently, so it is put in the
439+
"Other Parameters" section.
440+
441+
Parameters
442+
----------
443+
param1 : bool
444+
Description of commonly used parameter.
445+
446+
Other Parameters
447+
----------------
448+
param2 : str
449+
Description of infrequently used parameter.
450+
451+
See Also
452+
--------
453+
related : Something related.
454+
455+
Examples
456+
--------
457+
>>> result = 1 + 1
458+
"""
459+
pass
460+
434461

435462
class BadGenericDocStrings:
436463
"""Everything here has a bad docstring
@@ -1060,6 +1087,7 @@ def test_good_class(self, capsys):
10601087
"no_returns",
10611088
"empty_returns",
10621089
"multiple_variables_on_one_line",
1090+
"other_parameters",
10631091
"warnings",
10641092
],
10651093
)

numpydoc/validate.py

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -261,14 +261,26 @@ def extended_summary(self):
261261
return " ".join(self.doc["Summary"])
262262
return " ".join(self.doc["Extended Summary"])
263263

264-
@property
265-
def doc_parameters(self):
264+
def _doc_parameters(self, sections):
266265
parameters = collections.OrderedDict()
267-
for names, type_, desc in self.doc["Parameters"]:
268-
for name in names.split(", "):
269-
parameters[name] = (type_, desc)
266+
for section in sections:
267+
for names, type_, desc in self.doc[section]:
268+
for name in names.split(", "):
269+
parameters[name] = (type_, desc)
270270
return parameters
271271

272+
@property
273+
def doc_parameters(self):
274+
return self._doc_parameters(["Parameters"])
275+
276+
@property
277+
def doc_other_parameters(self):
278+
return self._doc_parameters(["Other Parameters"])
279+
280+
@property
281+
def doc_all_parameters(self):
282+
return self._doc_parameters(["Parameters", "Other Parameters"])
283+
272284
@property
273285
def signature_parameters(self):
274286
def add_stars(param_name, info):
@@ -307,22 +319,22 @@ def add_stars(param_name, info):
307319
def parameter_mismatches(self):
308320
errs = []
309321
signature_params = self.signature_parameters
310-
doc_params = tuple(self.doc_parameters)
311-
missing = set(signature_params) - set(doc_params)
322+
all_params = tuple(self.doc_all_parameters)
323+
missing = set(signature_params) - set(all_params)
312324
if missing:
313325
errs.append(error("PR01", missing_params=str(missing)))
314-
extra = set(doc_params) - set(signature_params)
326+
extra = set(all_params) - set(signature_params)
315327
if extra:
316328
errs.append(error("PR02", unknown_params=str(extra)))
317329
if (
318330
not missing
319331
and not extra
320-
and signature_params != doc_params
321-
and not (not signature_params and not doc_params)
332+
and signature_params != all_params
333+
and not (not signature_params and not all_params)
322334
):
323335
errs.append(
324336
error(
325-
"PR03", actual_params=signature_params, documented_params=doc_params
337+
"PR03", actual_params=signature_params, documented_params=all_params
326338
)
327339
)
328340

@@ -333,7 +345,7 @@ def directives_without_two_colons(self):
333345
return DIRECTIVE_PATTERN.findall(self.raw_doc)
334346

335347
def parameter_type(self, param):
336-
return self.doc_parameters[param][0]
348+
return self.doc_all_parameters[param][0]
337349

338350
@property
339351
def see_also(self):
@@ -542,7 +554,7 @@ def validate(obj_name):
542554
# PR03: Wrong parameters order
543555
errs += doc.parameter_mismatches
544556

545-
for param, kind_desc in doc.doc_parameters.items():
557+
for param, kind_desc in doc.doc_all_parameters.items():
546558
if not param.startswith("*"): # Check can ignore var / kwargs
547559
if not doc.parameter_type(param):
548560
if ":" in param:

0 commit comments

Comments
 (0)