diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index 8cd7c17a..05bb1ed8 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -168,7 +168,7 @@ class Comprehension(IterableWrapper): evaluator = self._evaluator comp_fors = list(self._get_comp_for().get_comp_fors()) - input_node = comp_fors[0].children[-1] + input_node = comp_fors[0].children[3] input_types = evaluator.eval_element(input_node) for result in nested(input_types, comp_fors, input_node): yield result @@ -206,6 +206,10 @@ class ListComprehension(Comprehension, ArrayMixin): def iter_content(self): return self._evaluator.eval_element(self.eval_node()) + def py__getitem__(self, index): + all_types = list(self.py__iter__()) + return all_types[index] + @property def name(self): return FakeSequence(self._evaluator, [], 'list').name @@ -272,7 +276,9 @@ class Array(IterableWrapper, ArrayMixin): """Here the index is an int/str. Raises IndexError/KeyError.""" if self.type == 'dict': for key, values in self._items(): - if index == key: + for k in self._evaluator.eval_element(key): + if isinstance(k, compiled.CompiledObject) \ + and index == k.obj: for value in values: return self._evaluator.eval_element(value) raise KeyError('No key found in dictionary %s.' % self) @@ -406,7 +412,10 @@ class FakeDict(_FakeArray): super(FakeDict, self).__init__(evaluator, dct, 'dict') self._dct = dct - def get_exact_index_types(self, index): + def py__iter__(self): + yield set(compiled.create(self._evaluator, key) for key in self._dct) + + def py__getitem__(self, index): return unite(self._evaluator.eval_element(v) for v in self._dct[index]) def _items(self): diff --git a/test/completion/comprehensions.py b/test/completion/comprehensions.py index f3f15de9..878ca1d1 100644 --- a/test/completion/comprehensions.py +++ b/test/completion/comprehensions.py @@ -30,8 +30,12 @@ a[0] arr = [1,''] a = [a for a in arr] -#? int() str() +#? int() a[0] +#? str() +a[1] +#? int() str() +a[2] a = [a if 1.0 else '' for a in [1] if [1.0]] #? int() str() @@ -54,7 +58,7 @@ def listen(arg): x listen(['' for x in [1]]) -#? str +#? ([str for x in []])[0] diff --git a/test/completion/functions.py b/test/completion/functions.py index 7adebb2a..6ef20c6b 100644 --- a/test/completion/functions.py +++ b/test/completion/functions.py @@ -327,6 +327,15 @@ exe[3] #? set exe[3]['c'] + +def kwargs_iteration(**kwargs): + return kwargs + +for x in kwargs_iteration(d=3): + #? float() + {'d': 1.0, 'c': '1'}[x] + + # ----------------- # nested *args # -----------------