diff --git a/jedi/evaluate/finder.py b/jedi/evaluate/finder.py index bd63bae3..30c1b470 100644 --- a/jedi/evaluate/finder.py +++ b/jedi/evaluate/finder.py @@ -301,7 +301,7 @@ def _name_to_types(evaluator, name, scope): typ = name.get_definition() if typ.isinstance(tree.ForStmt, tree.CompFor): container_types = evaluator.eval_element(typ.children[3]) - for_types = common.unite(iterable.py__iter__(evaluator, container_types)) + for_types = iterable.py__iter__types(evaluator, container_types) types = check_tuple_assignments(for_types, name) elif isinstance(typ, tree.Param): types = _eval_param(evaluator, typ, scope) diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index d8831bc5..965e1b6c 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -500,6 +500,14 @@ def py__iter__(evaluator, types): yield result +def py__iter__types(evaluator, types): + """ + Calls `py__iter__`, but ignores the ordering in the end and just returns + all types that it contains. + """ + return unite(py__iter__(evaluator, types)) + + def get_iterator_types(evaluator, element): """Returns the types of any iterator (arrays, yields, __iter__, etc).""" iterators = [] @@ -580,7 +588,8 @@ def _check_array_additions(evaluator, compare_array, module, is_list): result |= unite(evaluator.eval_element(node) for node in nodes) elif add_name in ['extend', 'update']: for key, nodes in params: - result |= unite(get_iterator_types(evaluator, node) for node in nodes) + types = unite(evaluator.eval_element(n) for n in nodes) + result |= py__iter__types(evaluator, types) return result from jedi.evaluate import representation as er, param @@ -691,8 +700,8 @@ class _ArrayInstance(IterableWrapper): """ items = set() for key, nodes in self.var_args.unpack(): - for node in nodes: - items |= get_iterator_types(self._evaluator, node) + types = unite(self._evaluator.eval_element(n) for n in nodes) + items |= py__iter__types(self._evaluator, types) module = self.var_args.get_parent_until() is_list = str(self.instance.name) == 'list' diff --git a/jedi/evaluate/stdlib.py b/jedi/evaluate/stdlib.py index c5de9ea7..68b42053 100644 --- a/jedi/evaluate/stdlib.py +++ b/jedi/evaluate/stdlib.py @@ -153,7 +153,8 @@ def builtins_super(evaluator, types, objects, scope): def get_iterable_content(evaluator, arguments, argument_index): nodes = list(arguments.unpack())[argument_index][1] - return unite(iterable.get_iterator_types(evaluator, node) for node in nodes) + types = unite(evaluator.eval_element(n) for n in nodes) + return iterable.py__iter__types(evaluator, types) @argument_clinic('sequence, /', want_obj=True, want_arguments=True) diff --git a/jedi/evaluate/sys_path.py b/jedi/evaluate/sys_path.py index a104bce6..6d177504 100644 --- a/jedi/evaluate/sys_path.py +++ b/jedi/evaluate/sys_path.py @@ -118,11 +118,13 @@ def _paths_from_assignment(evaluator, expr_stmt): except AssertionError: continue - from jedi.evaluate.iterable import get_iterator_types + from jedi.evaluate.iterable import py__iter__ from jedi.evaluate.precedence import is_string - for val in get_iterator_types(evaluator, expr_stmt): - if is_string(val): - yield val.obj + types = evaluator.eval_element(expr_stmt) + for types in py__iter__(evaluator, types): + for typ in types: + if is_string(typ): + yield typ.obj def _paths_from_list_modifications(module_path, trailer1, trailer2):