summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi KOMIYA <i.tkomiya@gmail.com>2022-04-02 14:45:52 +0900
committerTakeshi KOMIYA <i.tkomiya@gmail.com>2022-04-03 16:32:35 +0900
commita78c07ca07dfde49aa9cee38a9d64780bf360bea (patch)
tree174b9eb258fa124e5ae7e04b4afd590a0b4498c3
parent33610201dc7a69859b05381845ae1a11be8f9136 (diff)
downloadsphinx-git-a78c07ca07dfde49aa9cee38a9d64780bf360bea.tar.gz
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.
-rw-r--r--CHANGES2
-rw-r--r--sphinx/ext/autodoc/__init__.py14
-rw-r--r--tests/roots/test-ext-autodoc/target/docstring_signature.py6
-rw-r--r--tests/test_ext_autodoc_configs.py20
4 files changed, 32 insertions, 10 deletions
diff --git a/CHANGES b/CHANGES
index 7cf45d958..b341321de 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
* #10214: html: invalid language tag was generated if :confval:`language`
contains a country code (ex. zh_CN)
* #10236: html search: objects are duplicated in search result
diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py
index 295e0bf7d..62631f7ff 100644
--- a/sphinx/ext/autodoc/__init__.py
+++ b/sphinx/ext/autodoc/__init__.py
@@ -1580,6 +1580,20 @@ class ClassDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # type:
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 d9deb6244..981d936cd 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 @@ class D:
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)"""
diff --git a/tests/test_ext_autodoc_configs.py b/tests/test_ext_autodoc_configs.py
index 70515bca1..273e08210 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',
'',
]