mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-07 22:44:27 +08:00
implement slicing for __getitem__ with interpreter
This commit is contained in:
@@ -99,15 +99,15 @@ class CompiledObject(Base):
|
|||||||
self.obj.__getitem__
|
self.obj.__getitem__
|
||||||
|
|
||||||
result = []
|
result = []
|
||||||
from jedi.evaluate import iterable
|
|
||||||
for typ in index_types:
|
for typ in index_types:
|
||||||
if isinstance(typ, iterable.Slice):
|
index = None
|
||||||
result.append(self)
|
|
||||||
else:
|
|
||||||
try:
|
try:
|
||||||
new = self.obj[typ.obj]
|
index = typ.obj
|
||||||
|
new = self.obj[index]
|
||||||
except (KeyError, IndexError, TypeError, AttributeError):
|
except (KeyError, IndexError, TypeError, AttributeError):
|
||||||
pass # just try, we don't care if it fails.
|
# Just try, we don't care if it fails, except for slices.
|
||||||
|
if isinstance(index, slice):
|
||||||
|
result.append(self)
|
||||||
else:
|
else:
|
||||||
result.append(CompiledObject(new))
|
result.append(CompiledObject(new))
|
||||||
if not result:
|
if not result:
|
||||||
|
|||||||
@@ -425,17 +425,30 @@ class Slice(object):
|
|||||||
self._stop = stop
|
self._stop = stop
|
||||||
self._step = step
|
self._step = step
|
||||||
|
|
||||||
def start(self):
|
@property
|
||||||
return self._result(self._start)
|
def obj(self):
|
||||||
|
"""
|
||||||
|
Imitate CompiledObject.obj behavior and return a ``builtin.slice()``
|
||||||
|
object.
|
||||||
|
"""
|
||||||
|
def get(element):
|
||||||
|
if element is None:
|
||||||
|
return None
|
||||||
|
|
||||||
def stop(self):
|
result = self._evaluator.process_precedence_element(element)
|
||||||
return self._result(self._stop)
|
if len(result) != 1:
|
||||||
|
# We want slices to be clear defined with just one type.
|
||||||
|
# Otherwise we will return an empty slice object.
|
||||||
|
raise IndexError
|
||||||
|
try:
|
||||||
|
return result[0].obj
|
||||||
|
except AttributeError:
|
||||||
|
return None
|
||||||
|
|
||||||
def step(self):
|
try:
|
||||||
return self._result(self._step)
|
return slice(get(self._start), get(self._stop), get(self._step))
|
||||||
|
except IndexError:
|
||||||
def _result(self, element):
|
return slice(None, None, None)
|
||||||
return self._evaluator.process_precedence_element(element)
|
|
||||||
|
|
||||||
|
|
||||||
def create_indexes_or_slices(evaluator, index_array):
|
def create_indexes_or_slices(evaluator, index_array):
|
||||||
|
|||||||
@@ -63,3 +63,11 @@ class TestInterpreterAPI(TestCase):
|
|||||||
self.check_interpreter_complete('array[2].upper',
|
self.check_interpreter_complete('array[2].upper',
|
||||||
locals(),
|
locals(),
|
||||||
['upper'])
|
['upper'])
|
||||||
|
|
||||||
|
def test_slice(self):
|
||||||
|
class Foo():
|
||||||
|
bar = []
|
||||||
|
baz = 'xbarx'
|
||||||
|
self.check_interpreter_complete('getattr(Foo, baz[1:-1]).append',
|
||||||
|
locals(),
|
||||||
|
['append'])
|
||||||
|
|||||||
Reference in New Issue
Block a user