diff --git a/jedi/inference/compiled/access.py b/jedi/inference/compiled/access.py index dcdb589c..fb2d6150 100644 --- a/jedi/inference/compiled/access.py +++ b/jedi/inference/compiled/access.py @@ -9,7 +9,7 @@ import re import builtins import typing from pathlib import Path -from typing import Optional +from typing import Optional, Tuple from jedi.inference.compiled.getattr_static import getattr_static @@ -329,26 +329,26 @@ class DirectObjectAccess: except TypeError: return False - def is_allowed_getattr(self, name, safe=True): + def is_allowed_getattr(self, name, safe=True) -> Tuple[bool, bool]: # TODO this API is ugly. - if not safe: - # Unsafe is mostly used to check for __getattr__/__getattribute__. - # getattr_static works for properties, but the underscore methods - # are just ignored (because it's safer and avoids more code - # execution). See also GH #1378. - - # Avoid warnings, see comment in the next function. - with warnings.catch_warnings(record=True): - warnings.simplefilter("always") - try: - return hasattr(self._obj, name), False - except Exception: - # Obviously has an attribute (probably a property) that - # gets executed, so just avoid all exceptions here. - return False, False try: attr, is_get_descriptor = getattr_static(self._obj, name) except AttributeError: + if not safe: + # Unsafe is mostly used to check for __getattr__/__getattribute__. + # getattr_static works for properties, but the underscore methods + # are just ignored (because it's safer and avoids more code + # execution). See also GH #1378. + + # Avoid warnings, see comment in the next function. + with warnings.catch_warnings(record=True): + warnings.simplefilter("always") + try: + return hasattr(self._obj, name), False + except Exception: + # Obviously has an attribute (probably a property) that + # gets executed, so just avoid all exceptions here. + pass return False, False else: if is_get_descriptor and type(attr) not in ALLOWED_DESCRIPTOR_ACCESS: