diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index b8f62171..d5b3171a 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -35,6 +35,7 @@ from jedi.evaluate.cache import memoize_default from jedi.evaluate.helpers import FakeName, get_module_names from jedi.evaluate.finder import global_names_dict_generator, filter_definition_names from jedi.evaluate.sys_path import get_venv_path +from jedi.evaluate.iterable import create_for_dict # Jedi uses lots and lots of recursion. By setting this a little bit higher, we # can remove some "maximum recursion depth" errors. @@ -565,6 +566,11 @@ class Script(object): import_names |= set(path[-1] for path in node.paths()) for n in import_names: imports.ImportWrapper(self._evaluator, n).follow() + elif node.type == 'expr_stmt': + types = self._evaluator.eval_element(node) + for testlist in node.children[:-1:2]: + # Iterate tuples. + create_for_dict(self._evaluator, types, testlist) else: try_iter_content(self._evaluator.eval_element(node)) diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index 437fa000..d5955924 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -444,13 +444,17 @@ def ordered_elements_of_iterable(evaluator, iterable_type, all_values): def create_for_dict(evaluator, types, exprlist): + """ + Unpacking tuple assignments in for statements and expr_stmts. + """ if exprlist.type == 'name': return {exprlist.value: types} elif exprlist.type == 'atom' and exprlist.children[0] in '([': return create_for_dict(evaluator, types, exprlist.children[1]) - elif exprlist.type in ('testlist_comp', 'exprlist'): + elif exprlist.type in ('testlist', 'testlist_comp', 'exprlist', + 'testlist_star_expr'): dct = {} - parts = iter(exprlist.children[:2]) + parts = iter(exprlist.children[::2]) for iter_types in ordered_elements_of_iterable(evaluator, types, []): try: part = next(parts) diff --git a/test/static_analysis/iterable.py b/test/static_analysis/iterable.py index 488fb4b3..6e6c1ead 100644 --- a/test/static_analysis/iterable.py +++ b/test/static_analysis/iterable.py @@ -1,2 +1,3 @@ a, b = {'asdf': 3, 'b': 'str'} +a