diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py index 1490d1551..797b80dea 100644 --- a/sphinx/ext/autodoc/__init__.py +++ b/sphinx/ext/autodoc/__init__.py @@ -2505,22 +2505,19 @@ class AttributeDocumenter(GenericAliasMixin, NewTypeMixin, SlotsMixin, # type: pass def get_attribute_comment(self, parent: Any, attrname: str) -> Optional[List[str]]: - try: - for cls in inspect.getmro(parent): - try: - module = safe_getattr(cls, '__module__') - qualname = safe_getattr(cls, '__qualname__') + for cls in inspect.getmro(parent): + try: + module = safe_getattr(cls, '__module__') + qualname = safe_getattr(cls, '__qualname__') - analyzer = ModuleAnalyzer.for_module(module) - analyzer.analyze() - if qualname and self.objpath: - key = (qualname, attrname) - if key in analyzer.attr_docs: - return list(analyzer.attr_docs[key]) - except (AttributeError, PycodeError): - pass - except (AttributeError, PycodeError): - pass + analyzer = ModuleAnalyzer.for_module(module) + analyzer.analyze() + if qualname and self.objpath: + key = (qualname, attrname) + if key in analyzer.attr_docs: + return list(analyzer.attr_docs[key]) + except (AttributeError, PycodeError): + pass return None diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 202e170c1..faef8ce94 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -171,10 +171,7 @@ def getannotations(obj: Any) -> Mapping[str, Any]: def getmro(obj: Any) -> Tuple["Type", ...]: - """Get __mro__ from given *obj* safely. - - Raises AttributeError if given *obj* raises an error on accessing __mro__. - """ + """Get __mro__ from given *obj* safely.""" __mro__ = safe_getattr(obj, '__mro__', None) if isinstance(__mro__, tuple): return __mro__ @@ -481,12 +478,7 @@ def is_builtin_class_method(obj: Any, attr_name: str) -> bool: but PyPy implements it by pure Python code. """ try: - mro = inspect.getmro(obj) - except AttributeError: - # no __mro__, assume the object has no methods as we know them - return False - - try: + mro = getmro(obj) cls = next(c for c in mro if attr_name in safe_getattr(c, '__dict__', {})) except StopIteration: return False