mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
refactor: AttributeError handling for getmro() is not needed
Internally, sphinx.util.inspect.getmro() uses `safe_getattr()` with the `default` keyword. Therefore it never raises AttributeError even if the subject raises an error on accessing `__mro__` attribute. This fixes the wrong its usage.
This commit is contained in:
parent
be20f17892
commit
e6f445f2f8
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user