From 02fb73655c9a9894f20b91ac743e1b769d0350b0 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 26 Nov 2017 22:18:51 +0100 Subject: [PATCH] Fix a slice test with a better helper function --- jedi/evaluate/context/iterable.py | 10 +++++----- jedi/evaluate/helpers.py | 13 ++++++++++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/jedi/evaluate/context/iterable.py b/jedi/evaluate/context/iterable.py index 760e9b80..352738c5 100644 --- a/jedi/evaluate/context/iterable.py +++ b/jedi/evaluate/context/iterable.py @@ -27,7 +27,8 @@ from jedi.evaluate import analysis from jedi.evaluate import recursion from jedi.evaluate.lazy_context import LazyKnownContext, LazyKnownContexts, \ LazyTreeContext -from jedi.evaluate.helpers import is_string, predefine_names, evaluate_call_of_leaf +from jedi.evaluate.helpers import get_int_or_none, is_string, \ + predefine_names, evaluate_call_of_leaf from jedi.evaluate.utils import safe_property from jedi.evaluate.utils import to_list from jedi.evaluate.cache import evaluator_method_cache @@ -680,10 +681,9 @@ class Slice(Context): # For simplicity, we want slices to be clear defined with just # one type. Otherwise we will return an empty slice object. raise IndexError - try: - return list(result)[0].obj - except AttributeError: - return None + + context, = result + return get_int_or_none(context) try: return slice(get(self._start), get(self._stop), get(self._step)) diff --git a/jedi/evaluate/helpers.py b/jedi/evaluate/helpers.py index 44a6f6b4..66c1a37a 100644 --- a/jedi/evaluate/helpers.py +++ b/jedi/evaluate/helpers.py @@ -190,5 +190,16 @@ def is_literal(context): return is_number(context) or is_string(context) +def _get_safe_value_or_none(context, accept): + if is_compiled(context): + value = context.get_safe_value(default=None) + if isinstance(value, accept): + return value + + +def get_int_or_none(context): + return _get_safe_value_or_none(context, int) + + def is_number(context): - return is_compiled(context) and isinstance(context.get_safe_value(default=None), (int, float)) + return _get_safe_value_or_none(context, (int, float)) is not None