1
0
forked from VimPlug/jedi

Avoid multiple getattrs instead of a single one, see also #1933

This commit is contained in:
Dave Halter
2023-07-28 15:10:37 +02:00
parent 8d9e3ab3a7
commit 6455a14841

View File

@@ -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: