diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index d5b3171a..769ee0b6 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -35,7 +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 +from jedi.evaluate.iterable import unpack_tuple_to_dict # Jedi uses lots and lots of recursion. By setting this a little bit higher, we # can remove some "maximum recursion depth" errors. @@ -570,7 +570,7 @@ class Script(object): types = self._evaluator.eval_element(node) for testlist in node.children[:-1:2]: # Iterate tuples. - create_for_dict(self._evaluator, types, testlist) + unpack_tuple_to_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 d5955924..e253422e 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -157,7 +157,7 @@ class Comprehension(IterableWrapper): exprlist = comp_for.children[1] for types in iterated: evaluator.predefined_if_name_dict_dict[comp_for] = \ - create_for_dict(evaluator, types, exprlist) + unpack_tuple_to_dict(evaluator, types, exprlist) try: if len(comp_fors) > 1: for result in nested(types, comp_fors[1:]): @@ -443,14 +443,14 @@ def ordered_elements_of_iterable(evaluator, iterable_type, all_values): return ordered -def create_for_dict(evaluator, types, exprlist): +def unpack_tuple_to_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]) + return unpack_tuple_to_dict(evaluator, types, exprlist.children[1]) elif exprlist.type in ('testlist', 'testlist_comp', 'exprlist', 'testlist_star_expr'): dct = {} @@ -461,13 +461,17 @@ def create_for_dict(evaluator, types, exprlist): except StopIteration: raise NotImplementedError else: - dct.update(create_for_dict(evaluator, iter_types, part)) + dct.update(unpack_tuple_to_dict(evaluator, iter_types, part)) has_parts = next(parts, None) if has_parts is not None: raise NotImplementedError return dct - else: - raise NotImplementedError + elif exprlist.type == 'power': + # Something like ``arr[x], var = ...``. + # This is something that is not yet supported, would also be difficult + # to write into a dict. + return {} + raise NotImplementedError def get_iterator_types(evaluator, element): diff --git a/test/static_analysis/iterable.py b/test/static_analysis/iterable.py index 6e6c1ead..7e7ab72a 100644 --- a/test/static_analysis/iterable.py +++ b/test/static_analysis/iterable.py @@ -1,3 +1,6 @@ a, b = {'asdf': 3, 'b': 'str'} a + +x = [1] +x[0], b = {'a': 1, 'b': '2'}