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 builtins
import typing import typing
from pathlib import Path from pathlib import Path
from typing import Optional from typing import Optional, Tuple
from jedi.inference.compiled.getattr_static import getattr_static from jedi.inference.compiled.getattr_static import getattr_static
@@ -329,8 +329,11 @@ class DirectObjectAccess:
except TypeError: except TypeError:
return False 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. # TODO this API is ugly.
try:
attr, is_get_descriptor = getattr_static(self._obj, name)
except AttributeError:
if not safe: if not safe:
# Unsafe is mostly used to check for __getattr__/__getattribute__. # Unsafe is mostly used to check for __getattr__/__getattribute__.
# getattr_static works for properties, but the underscore methods # getattr_static works for properties, but the underscore methods
@@ -345,10 +348,7 @@ class DirectObjectAccess:
except Exception: except Exception:
# Obviously has an attribute (probably a property) that # Obviously has an attribute (probably a property) that
# gets executed, so just avoid all exceptions here. # gets executed, so just avoid all exceptions here.
return False, False pass
try:
attr, is_get_descriptor = getattr_static(self._obj, name)
except AttributeError:
return False, False return False, False
else: else:
if is_get_descriptor and type(attr) not in ALLOWED_DESCRIPTOR_ACCESS: if is_get_descriptor and type(attr) not in ALLOWED_DESCRIPTOR_ACCESS: