1
0
forked from VimPlug/jedi

Disable some features for big annoying libraries like pandas, tensorflow, see #520

This commit is contained in:
Dave Halter
2020-01-04 02:39:36 +01:00
parent 441ede2c7f
commit 47d3aa73dc
4 changed files with 17 additions and 2 deletions

View File

@@ -24,7 +24,7 @@ from jedi.inference.cache import inference_state_method_cache
from jedi.inference import imports from jedi.inference import imports
from jedi.inference.arguments import TreeArguments from jedi.inference.arguments import TreeArguments
from jedi.inference.param import get_executed_param_names from jedi.inference.param import get_executed_param_names
from jedi.inference.helpers import is_stdlib_path from jedi.inference.helpers import is_stdlib_path, is_big_annoying_library
from jedi.inference.utils import to_list from jedi.inference.utils import to_list
from jedi.inference.value import instance from jedi.inference.value import instance
from jedi.inference.base_value import ValueSet, NO_VALUES from jedi.inference.base_value import ValueSet, NO_VALUES
@@ -67,6 +67,9 @@ def dynamic_param_lookup(function_value, param_index):
have to look for all calls to ``func`` to find out what ``foo`` possibly have to look for all calls to ``func`` to find out what ``foo`` possibly
is. is.
""" """
if is_big_annoying_library(function_value.parent_context):
return NO_VALUES
funcdef = function_value.tree_node funcdef = function_value.tree_node
if not settings.dynamic_params: if not settings.dynamic_params:

View File

@@ -1,5 +1,6 @@
from jedi.parser_utils import get_flow_branch_keyword, is_scope, get_parent_scope from jedi.parser_utils import get_flow_branch_keyword, is_scope, get_parent_scope
from jedi.inference.recursion import execution_allowed from jedi.inference.recursion import execution_allowed
from jedi.inference.helpers import is_big_annoying_library
class Status(object): class Status(object):
@@ -42,6 +43,9 @@ def _get_flow_scopes(node):
def reachability_check(context, value_scope, node, origin_scope=None): def reachability_check(context, value_scope, node, origin_scope=None):
if is_big_annoying_library(context):
return UNSURE
first_flow_scope = get_parent_scope(node, include_flows=True) first_flow_scope = get_parent_scope(node, include_flows=True)
if origin_scope is not None: if origin_scope is not None:
origin_flow_scopes = list(_get_flow_scopes(origin_scope)) origin_flow_scopes = list(_get_flow_scopes(origin_scope))

View File

@@ -261,3 +261,9 @@ def parse_dotted_names(nodes, is_import_from, until_node=None):
def values_from_qualified_names(inference_state, *names): def values_from_qualified_names(inference_state, *names):
return inference_state.import_module(names[:-1]).py__getattribute__(names[-1]) return inference_state.import_module(names[:-1]).py__getattribute__(names[-1])
def is_big_annoying_library(context):
string_names = context.get_root_context().string_names
# Pandas is huge, so just ignore it, because stuff makes everything slow.
return string_names[0] in ('pandas', 'numpy', 'tensorflow', 'matplotlib')

View File

@@ -6,7 +6,7 @@ from jedi import debug
from jedi import settings from jedi import settings
from jedi.inference import compiled from jedi.inference import compiled
from jedi.inference.compiled.value import CompiledObjectFilter from jedi.inference.compiled.value import CompiledObjectFilter
from jedi.inference.helpers import values_from_qualified_names from jedi.inference.helpers import values_from_qualified_names, is_big_annoying_library
from jedi.inference.filters import AbstractFilter, AnonymousFunctionExecutionFilter from jedi.inference.filters import AbstractFilter, AnonymousFunctionExecutionFilter
from jedi.inference.names import ValueName, TreeNameDefinition, ParamName, \ from jedi.inference.names import ValueName, TreeNameDefinition, ParamName, \
NameWrapper NameWrapper
@@ -237,6 +237,8 @@ class _BaseTreeInstance(AbstractInstanceValue):
# We are inversing this, because a hand-crafted `__getattribute__` # We are inversing this, because a hand-crafted `__getattribute__`
# could still call another hand-crafted `__getattr__`, but not the # could still call another hand-crafted `__getattr__`, but not the
# other way around. # other way around.
if is_big_annoying_library(self.parent_context):
return NO_VALUES
names = (self.get_function_slot_names(u'__getattr__') names = (self.get_function_slot_names(u'__getattr__')
or self.get_function_slot_names(u'__getattribute__')) or self.get_function_slot_names(u'__getattribute__'))
return self.execute_function_slots(names, name) return self.execute_function_slots(names, name)