diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py index cfca54225..6fda377a1 100644 --- a/sphinx/ext/autodoc/__init__.py +++ b/sphinx/ext/autodoc/__init__.py @@ -1584,18 +1584,19 @@ class AttributeDocumenter(DocstringStripSignatureMixin, ClassLevelDocumenter): super().add_directive_header(sig) sourcename = self.get_sourcename() if not self.options.annotation: - if not self._datadescriptor: - # obtain annotation for this attribute - annotations = getattr(self.parent, '__annotations__', {}) - if annotations and self.objpath[-1] in annotations: - objrepr = stringify_typehint(annotations.get(self.objpath[-1])) - self.add_line(' :type: ' + objrepr, sourcename) - else: - key = ('.'.join(self.objpath[:-1]), self.objpath[-1]) - if self.analyzer and key in self.analyzer.annotations: - self.add_line(' :type: ' + self.analyzer.annotations[key], - sourcename) + # obtain type annotation for this attribute + annotations = getattr(self.parent, '__annotations__', {}) + if annotations and self.objpath[-1] in annotations: + objrepr = stringify_typehint(annotations.get(self.objpath[-1])) + self.add_line(' :type: ' + objrepr, sourcename) + else: + key = ('.'.join(self.objpath[:-1]), self.objpath[-1]) + if self.analyzer and key in self.analyzer.annotations: + self.add_line(' :type: ' + self.analyzer.annotations[key], + sourcename) + # data descriptors do not have useful values + if not self._datadescriptor: try: objrepr = object_description(self.object) self.add_line(' :value: ' + objrepr, sourcename) diff --git a/tests/roots/test-ext-autodoc/target/typed_vars.py b/tests/roots/test-ext-autodoc/target/typed_vars.py index b0782787e..65302fa44 100644 --- a/tests/roots/test-ext-autodoc/target/typed_vars.py +++ b/tests/roots/test-ext-autodoc/target/typed_vars.py @@ -6,11 +6,20 @@ attr2: str attr3 = '' # type: str +class _Descriptor: + def __init__(self, name): + self.__doc__ = "This is {}".format(name) + def __get__(self): + pass + + class Class: attr1: int = 0 attr2: int attr3 = 0 # type: int + descr4: int = _Descriptor("descr4") + def __init__(self): self.attr4: int = 0 #: attr4 self.attr5: int #: attr5 diff --git a/tests/test_autodoc.py b/tests/test_autodoc.py index dd474536d..3bbd35513 100644 --- a/tests/test_autodoc.py +++ b/tests/test_autodoc.py @@ -1518,6 +1518,13 @@ def test_autodoc_typed_instance_variables(app): ' attr6', '', '', + ' .. py:attribute:: Class.descr4', + ' :module: target.typed_vars', + ' :type: int', + '', + ' This is descr4', + '', + '', '.. py:data:: attr1', ' :module: target.typed_vars', ' :type: str',