From 9f52d7dd3f5d29fe6fa9ce17cabe3728cc517c36 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 2 Apr 2022 14:45:52 +0900 Subject: [PATCH] Fix #10280: autodoc_docstring_signature generates needless return typehint Basically, autodoc suppresses return value typehint for class constructors. But it was unexpectedly shown if `autodoc_docstring_signature` is enabled and docstring has multiple signatures. --- CHANGES | 2 ++ sphinx/ext/autodoc/__init__.py | 13 ++++++++++++ .../target/docstring_signature.py | 6 ++++-- tests/test_ext_autodoc_configs.py | 20 +++++++++++-------- 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 7037723fe50..64cf4333d68 100644 --- a/CHANGES +++ b/CHANGES @@ -67,6 +67,8 @@ Bugs fixed * #10279: autodoc: Default values for keyword only arguments in overloaded functions are rendered as a string literal +* #10280: autodoc: :confval:`autodoc_docstring_signature` unexpectedly generates + return value typehint for constructors if docstring has multiple signatures * #10236: html search: objects are duplicated in search result * #9962: texinfo: Deprecation message for ``@definfoenclose`` command on bulding texinfo document diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py index 295e0bf7d67..8c2ab38dc0c 100644 --- a/sphinx/ext/autodoc/__init__.py +++ b/sphinx/ext/autodoc/__init__.py @@ -1580,6 +1580,19 @@ def format_args(self, **kwargs: Any) -> str: return stringify_signature(sig, show_return_annotation=False, **kwargs) + def _find_signature(self) -> Tuple[str, str]: + result = super()._find_signature() + if result is not None: + # Strip a return value from signature of constructor in docstring (first entry) + result = (result[0], None) + + for i, sig in enumerate(self._signatures): + if sig.endswith(' -> None'): + # Strip a return value from signatures of constructor in docstring (subsequent entries) + self._signatures[i] = sig[:-8] + + return result + def format_signature(self, **kwargs: Any) -> str: if self.doc_as_attr: return '' diff --git a/tests/roots/test-ext-autodoc/target/docstring_signature.py b/tests/roots/test-ext-autodoc/target/docstring_signature.py index d9deb6244ac..27252c521e5 100644 --- a/tests/roots/test-ext-autodoc/target/docstring_signature.py +++ b/tests/roots/test-ext-autodoc/target/docstring_signature.py @@ -22,10 +22,12 @@ def __init__(self): class E: def __init__(self): """E(foo: int, bar: int, baz: int) -> None \\ - E(foo: str, bar: str, baz: str) -> None""" + E(foo: str, bar: str, baz: str) -> None \\ + E(foo: float, bar: float, baz: float)""" class F: def __init__(self): """F(foo: int, bar: int, baz: int) -> None - F(foo: str, bar: str, baz: str) -> None""" + F(foo: str, bar: str, baz: str) -> None + F(foo: float, bar: float, baz: float) -> None""" diff --git a/tests/test_ext_autodoc_configs.py b/tests/test_ext_autodoc_configs.py index 70515bca12d..273e08210da 100644 --- a/tests/test_ext_autodoc_configs.py +++ b/tests/test_ext_autodoc_configs.py @@ -467,13 +467,15 @@ def test_autoclass_content_and_docstring_signature_init(app): ' :module: target.docstring_signature', '', '', - '.. py:class:: E(foo: int, bar: int, baz: int) -> None', - ' E(foo: str, bar: str, baz: str) -> None', + '.. py:class:: E(foo: int, bar: int, baz: int)', + ' E(foo: str, bar: str, baz: str)', + ' E(foo: float, bar: float, baz: float)', ' :module: target.docstring_signature', '', '', - '.. py:class:: F(foo: int, bar: int, baz: int) -> None', - ' F(foo: str, bar: str, baz: str) -> None', + '.. py:class:: F(foo: int, bar: int, baz: int)', + ' F(foo: str, bar: str, baz: str)', + ' F(foo: float, bar: float, baz: float)', ' :module: target.docstring_signature', '', ] @@ -510,13 +512,15 @@ def test_autoclass_content_and_docstring_signature_both(app): ' :module: target.docstring_signature', '', '', - '.. py:class:: E(foo: int, bar: int, baz: int) -> None', - ' E(foo: str, bar: str, baz: str) -> None', + '.. py:class:: E(foo: int, bar: int, baz: int)', + ' E(foo: str, bar: str, baz: str)', + ' E(foo: float, bar: float, baz: float)', ' :module: target.docstring_signature', '', '', - '.. py:class:: F(foo: int, bar: int, baz: int) -> None', - ' F(foo: str, bar: str, baz: str) -> None', + '.. py:class:: F(foo: int, bar: int, baz: int)', + ' F(foo: str, bar: str, baz: str)', + ' F(foo: float, bar: float, baz: float)', ' :module: target.docstring_signature', '', ]