Fix: Tuple unpacking to x[0] would raise bugs.

This commit is contained in:
Dave Halter
2015-11-24 01:27:23 +01:00
parent cf4c2cb198
commit 8dee92bcc5
3 changed files with 15 additions and 8 deletions

View File

@@ -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))

View File

@@ -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,12 +461,16 @@ 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:
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

View File

@@ -1,3 +1,6 @@
a, b = {'asdf': 3, 'b': 'str'}
a
x = [1]
x[0], b = {'a': 1, 'b': '2'}