Move the is_string etc functions to the helpers module.

This commit is contained in:
Dave Halter
2017-09-28 14:28:07 +02:00
parent 6b76e37673
commit e62d89bb03
3 changed files with 25 additions and 24 deletions

View File

@@ -7,7 +7,9 @@ from contextlib import contextmanager
from parso.python import tree from parso.python import tree
from jedi._compatibility import unicode
from jedi.parser_utils import get_parent_scope from jedi.parser_utils import get_parent_scope
from jedi.evaluate.compiled import CompiledObject
def is_stdlib_path(path): def is_stdlib_path(path):
@@ -174,3 +176,19 @@ def predefine_names(context, flow_scope, dct):
yield yield
finally: finally:
del predefined[flow_scope] del predefined[flow_scope]
def is_compiled(context):
return isinstance(context, CompiledObject)
def is_string(context):
return is_compiled(context) and isinstance(context.obj, (str, unicode))
def is_literal(context):
return is_number(context) or is_string(context)
def is_number(context):
return is_compiled(context) and isinstance(context.obj, (int, float))

View File

@@ -23,12 +23,11 @@ It is important to note that:
from jedi import debug from jedi import debug
from jedi import settings from jedi import settings
from jedi.evaluate.utils import safe_property from jedi.evaluate.utils import safe_property
from jedi._compatibility import unicode, is_py3 from jedi._compatibility import is_py3
from jedi.evaluate.utils import to_list from jedi.evaluate.utils import to_list
from jedi.evaluate import compiled from jedi.evaluate import compiled
from jedi.evaluate import helpers from jedi.evaluate import helpers
from jedi.evaluate import analysis from jedi.evaluate import analysis
from jedi.evaluate import pep0484
from jedi.evaluate.syntax_tree import is_string from jedi.evaluate.syntax_tree import is_string
from jedi.evaluate import recursion from jedi.evaluate import recursion
from jedi.evaluate.cache import evaluator_method_cache from jedi.evaluate.cache import evaluator_method_cache

View File

@@ -6,7 +6,6 @@ import operator as op
from parso.python import tree from parso.python import tree
from jedi._compatibility import unicode
from jedi import debug from jedi import debug
from jedi import parser_utils from jedi import parser_utils
from jedi.evaluate.context import ContextSet, NO_CONTEXTS, ContextualizedNode, \ from jedi.evaluate.context import ContextSet, NO_CONTEXTS, ContextualizedNode, \
@@ -16,6 +15,7 @@ from jedi.evaluate import pep0484
from jedi.evaluate import recursion from jedi.evaluate import recursion
from jedi.evaluate import helpers from jedi.evaluate import helpers
from jedi.evaluate import analysis from jedi.evaluate import analysis
from jedi.evaluate.helpers import is_string, is_literal, is_number, is_compiled
def _limit_context_infers(func): def _limit_context_infers(func):
@@ -308,7 +308,7 @@ def eval_factor(context_set, operator):
""" """
for context in context_set: for context in context_set:
if operator == '-': if operator == '-':
if _is_number(context): if is_number(context):
yield compiled.create(context.evaluator, -context.obj) yield compiled.create(context.evaluator, -context.obj)
elif operator == 'not': elif operator == 'not':
value = context.py__bool__() value = context.py__bool__()
@@ -337,7 +337,7 @@ def _literals_to_types(evaluator, result):
# int(), float(), etc). # int(), float(), etc).
new_result = NO_CONTEXTS new_result = NO_CONTEXTS
for typ in result: for typ in result:
if _is_literal(typ): if is_literal(typ):
# Literals are only valid as long as the operations are # Literals are only valid as long as the operations are
# correct. Otherwise add a value-free instance. # correct. Otherwise add a value-free instance.
cls = compiled.builtin_from_name(evaluator, typ.name.string_name) cls = compiled.builtin_from_name(evaluator, typ.name.string_name)
@@ -366,22 +366,6 @@ def _eval_comparison(evaluator, context, left_contexts, operator, right_contexts
) )
def _is_compiled(context):
return isinstance(context, compiled.CompiledObject)
def _is_number(context):
return _is_compiled(context) and isinstance(context.obj, (int, float))
def is_string(context):
return _is_compiled(context) and isinstance(context.obj, (str, unicode))
def _is_literal(context):
return _is_number(context) or is_string(context)
def _is_tuple(context): def _is_tuple(context):
from jedi.evaluate import iterable from jedi.evaluate import iterable
return isinstance(context, iterable.AbstractSequence) and context.array_type == 'tuple' return isinstance(context, iterable.AbstractSequence) and context.array_type == 'tuple'
@@ -394,8 +378,8 @@ def _is_list(context):
def _eval_comparison_part(evaluator, context, left, operator, right): def _eval_comparison_part(evaluator, context, left, operator, right):
from jedi.evaluate import iterable, instance from jedi.evaluate import iterable, instance
l_is_num = _is_number(left) l_is_num = is_number(left)
r_is_num = _is_number(right) r_is_num = is_number(right)
if operator == '*': if operator == '*':
# for iterables, ignore * operations # for iterables, ignore * operations
if isinstance(left, iterable.AbstractSequence) or is_string(left): if isinstance(left, iterable.AbstractSequence) or is_string(left):
@@ -416,7 +400,7 @@ def _eval_comparison_part(evaluator, context, left, operator, right):
return ContextSet(left) return ContextSet(left)
elif operator in COMPARISON_OPERATORS: elif operator in COMPARISON_OPERATORS:
operation = COMPARISON_OPERATORS[operator] operation = COMPARISON_OPERATORS[operator]
if _is_compiled(left) and _is_compiled(right): if is_compiled(left) and is_compiled(right):
# Possible, because the return is not an option. Just compare. # Possible, because the return is not an option. Just compare.
left = left.obj left = left.obj
right = right.obj right = right.obj