Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(numpy-param-doc): allow "default" in params #7360

Open
wants to merge 12 commits into
base: main
Choose a base branch
from
4 changes: 4 additions & 0 deletions doc/whatsnew/fragments/6211.false_negative
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Using "default" in parameter signatures of NumPy doctrings emitted a `missing-param`
error.

Closes #6211
5 changes: 4 additions & 1 deletion pylint/extensions/_check_docs_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -832,14 +832,17 @@ class NumpyDocstring(GoogleDocstring):

re_default_value = r"""((['"]\w+\s*['"])|(\d+)|(True)|(False)|(None))"""

re_default_param = rf"""default[=: ]{re_default_value}"""

re_param_line = re.compile(
rf"""
\s* (?P<param_name>\*{{0,2}}\w+)(\s?(:|\n)) # identifier with potential asterisks
\s*
(?P<param_type>
(
({GoogleDocstring.re_multiple_type}) # default type declaration
(,\s+optional)? # optional 'optional' indication
(,\s+optional|,\s+{re_default_param})? # optional 'optional' indication
# or default value
)?
(
{{({re_default_value},?\s*)+}} # set of default values
Expand Down
42 changes: 42 additions & 0 deletions tests/functional/ext/docparams/docparams.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
"""Fixture for testing missing documentation in docparams."""

from __future__ import annotations

# pylint: disable=broad-exception-raised


def _private_func1( # [missing-return-doc, missing-return-type-doc, missing-any-param-doc]
param1,
):
Expand Down Expand Up @@ -104,5 +108,43 @@ def params_are_documented(par1: int, *, par2: int) -> int:
return par1 + par2


def params_with_pipe(arg1: int | bool, arg2: str | None = None) -> None:
"""No errors raised when pipe symbol used for or.

`PEP 604`_ allows writing Union types as X | Y. Can be enabled in Python <3.10
using `from __future__ import annotations`.

Parameters
----------
arg1 : int | bool
The first arg
arg2 : str | None, default=None
The second arg

.. _`PEP 604`:
https://peps.python.org/pep-0604/
"""

print(arg1, arg2)


def regression_6211(number: int = 0) -> None:
"""This is a regression test for issue `#6211`_.

False negative of "missing param doc" was being issued when "default" used in
NumPy-style docs. This test should return no errors.

Parameters
----------
number : int, default 0
The number parameter

.. _`#6211`:
https://github.com/PyCQA/pylint/issues/6211
"""

print(number)


# Only check raise nodes within FunctionDefs
raise Exception()
44 changes: 22 additions & 22 deletions tests/functional/ext/docparams/docparams.txt
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
missing-any-param-doc:4:0:4:18:_private_func1:"Missing any documentation in ""_private_func1""":HIGH
missing-return-doc:4:0:4:18:_private_func1:Missing return documentation:HIGH
missing-return-type-doc:4:0:4:18:_private_func1:Missing return type documentation:HIGH
missing-any-param-doc:11:0:11:18:_private_func2:"Missing any documentation in ""_private_func2""":HIGH
missing-yield-doc:11:0:11:18:_private_func2:Missing yield documentation:HIGH
missing-yield-type-doc:11:0:11:18:_private_func2:Missing yield type documentation:HIGH
missing-any-param-doc:18:0:18:18:_private_func3:"Missing any documentation in ""_private_func3""":HIGH
missing-raises-doc:18:0:18:18:_private_func3:"""Exception"" not documented as being raised":HIGH
missing-any-param-doc:23:0:23:16:public_func1:"Missing any documentation in ""public_func1""":HIGH
missing-any-param-doc:29:0:29:30:_async_private_func1:"Missing any documentation in ""_async_private_func1""":HIGH
missing-return-doc:29:0:29:30:_async_private_func1:Missing return documentation:HIGH
missing-return-type-doc:29:0:29:30:_async_private_func1:Missing return type documentation:HIGH
missing-any-param-doc:37:0:37:30:_async_private_func2:"Missing any documentation in ""_async_private_func2""":HIGH
missing-yield-doc:37:0:37:30:_async_private_func2:Missing yield documentation:HIGH
missing-yield-type-doc:37:0:37:30:_async_private_func2:Missing yield type documentation:HIGH
missing-any-param-doc:44:0:44:30:_async_private_func3:"Missing any documentation in ""_async_private_func3""":HIGH
missing-raises-doc:44:0:44:30:_async_private_func3:"""Exception"" not documented as being raised":HIGH
missing-any-param-doc:49:0:49:28:async_public_func1:"Missing any documentation in ""async_public_func1""":HIGH
differing-param-doc:54:0:54:23:differing_param_doc:"""param"" differing in parameter documentation":HIGH
differing-param-doc:65:0:65:35:differing_param_doc_kwords_only:"""param"" differing in parameter documentation":HIGH
missing-type-doc:76:0:76:20:missing_type_doc:"""par1"" missing in parameter type documentation":HIGH
missing-type-doc:86:0:86:32:missing_type_doc_kwords_only:"""par1"" missing in parameter type documentation":HIGH
missing-any-param-doc:6:0:6:18:_private_func1:"Missing any documentation in ""_private_func1""":HIGH
missing-return-doc:6:0:6:18:_private_func1:Missing return documentation:HIGH
missing-return-type-doc:6:0:6:18:_private_func1:Missing return type documentation:HIGH
missing-any-param-doc:13:0:13:18:_private_func2:"Missing any documentation in ""_private_func2""":HIGH
missing-yield-doc:13:0:13:18:_private_func2:Missing yield documentation:HIGH
missing-yield-type-doc:13:0:13:18:_private_func2:Missing yield type documentation:HIGH
missing-any-param-doc:20:0:20:18:_private_func3:"Missing any documentation in ""_private_func3""":HIGH
missing-raises-doc:20:0:20:18:_private_func3:"""Exception"" not documented as being raised":HIGH
missing-any-param-doc:25:0:25:16:public_func1:"Missing any documentation in ""public_func1""":HIGH
missing-any-param-doc:31:0:31:30:_async_private_func1:"Missing any documentation in ""_async_private_func1""":HIGH
missing-return-doc:31:0:31:30:_async_private_func1:Missing return documentation:HIGH
missing-return-type-doc:31:0:31:30:_async_private_func1:Missing return type documentation:HIGH
missing-any-param-doc:39:0:39:30:_async_private_func2:"Missing any documentation in ""_async_private_func2""":HIGH
missing-yield-doc:39:0:39:30:_async_private_func2:Missing yield documentation:HIGH
missing-yield-type-doc:39:0:39:30:_async_private_func2:Missing yield type documentation:HIGH
missing-any-param-doc:46:0:46:30:_async_private_func3:"Missing any documentation in ""_async_private_func3""":HIGH
missing-raises-doc:46:0:46:30:_async_private_func3:"""Exception"" not documented as being raised":HIGH
missing-any-param-doc:51:0:51:28:async_public_func1:"Missing any documentation in ""async_public_func1""":HIGH
differing-param-doc:56:0:56:23:differing_param_doc:"""param"" differing in parameter documentation":HIGH
differing-param-doc:67:0:67:35:differing_param_doc_kwords_only:"""param"" differing in parameter documentation":HIGH
missing-type-doc:78:0:78:20:missing_type_doc:"""par1"" missing in parameter type documentation":HIGH
missing-type-doc:88:0:88:32:missing_type_doc_kwords_only:"""par1"" missing in parameter type documentation":HIGH