diff --git a/jedi/inference/syntax_tree.py b/jedi/inference/syntax_tree.py index f94db48f..c5d9400b 100644 --- a/jedi/inference/syntax_tree.py +++ b/jedi/inference/syntax_tree.py @@ -865,10 +865,16 @@ def check_tuple_assignments(name, value_set): # For no star unpacking is not possible. return NO_VALUES i = 0 + lazy_value = None while i <= index: try: lazy_value = next(iterated) except StopIteration: + # A desperate attempt to fix inference for tuples from an + # iterator. + if lazy_value is not None: + return lazy_value.infer() + # We could do this with the default param in next. But this # would allow this loop to run for a very long time if the # index number is high. Therefore break if the loop is diff --git a/jedi/inference/value/instance.py b/jedi/inference/value/instance.py index 75301e2a..fa15d96f 100644 --- a/jedi/inference/value/instance.py +++ b/jedi/inference/value/instance.py @@ -155,8 +155,9 @@ class AbstractInstanceValue(Value): return super().py__iter__(contextualized_node) def iterate(): - for generator in self.execute_function_slots(iter_slot_names): - yield from generator.py__next__(contextualized_node) + yield LazyKnownValues( + self.execute_function_slots(iter_slot_names).py__next__(contextualized_node).infer() + ) return iterate() def __repr__(self): diff --git a/test/completion/arrays.py b/test/completion/arrays.py index bb397f40..9df9db58 100644 --- a/test/completion/arrays.py +++ b/test/completion/arrays.py @@ -207,16 +207,16 @@ C().a (f, g) = (1,) #? int() f -#? [] -g. +#? int() +g (f, g, h) = (1,'') #? int() f #? str() g -#? [] -h. +#? str() +h (f1, g1) = 1 #? [] @@ -311,9 +311,13 @@ for x in {1: 3.0, '': 1j}: dict().values().__iter__ d = dict(a=3, b='') -x, = d.values() +x, y, z = d.values() #? int() str() x +#? int() str() +y +#? int() str() +z #? int() d['a'] #? int() str() None