Skip to content

Commit

Permalink
Fix #10280: autodoc_docstring_signature generates needless return typ…
Browse files Browse the repository at this point in the history
…ehint

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.
  • Loading branch information
tk0miya committed Apr 2, 2022
1 parent 9141464 commit 9f52d7d
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 10 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Expand Up @@ -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
Expand Down
13 changes: 13 additions & 0 deletions sphinx/ext/autodoc/__init__.py
Expand Up @@ -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 ''
Expand Down
6 changes: 4 additions & 2 deletions tests/roots/test-ext-autodoc/target/docstring_signature.py
Expand Up @@ -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"""
20 changes: 12 additions & 8 deletions tests/test_ext_autodoc_configs.py
Expand Up @@ -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',
'',
]
Expand Down Expand Up @@ -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',
'',
]
Expand Down

0 comments on commit 9f52d7d

Please sign in to comment.