forked from VimPlug/jedi
Now expr_stmt tuple unpacking automatically works with static analysis.
This commit is contained in:
@@ -35,6 +35,7 @@ from jedi.evaluate.cache import memoize_default
|
|||||||
from jedi.evaluate.helpers import FakeName, get_module_names
|
from jedi.evaluate.helpers import FakeName, get_module_names
|
||||||
from jedi.evaluate.finder import global_names_dict_generator, filter_definition_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.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
|
# Jedi uses lots and lots of recursion. By setting this a little bit higher, we
|
||||||
# can remove some "maximum recursion depth" errors.
|
# can remove some "maximum recursion depth" errors.
|
||||||
@@ -565,6 +566,11 @@ class Script(object):
|
|||||||
import_names |= set(path[-1] for path in node.paths())
|
import_names |= set(path[-1] for path in node.paths())
|
||||||
for n in import_names:
|
for n in import_names:
|
||||||
imports.ImportWrapper(self._evaluator, n).follow()
|
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:
|
else:
|
||||||
try_iter_content(self._evaluator.eval_element(node))
|
try_iter_content(self._evaluator.eval_element(node))
|
||||||
|
|
||||||
|
|||||||
@@ -444,13 +444,17 @@ def ordered_elements_of_iterable(evaluator, iterable_type, all_values):
|
|||||||
|
|
||||||
|
|
||||||
def create_for_dict(evaluator, types, exprlist):
|
def create_for_dict(evaluator, types, exprlist):
|
||||||
|
"""
|
||||||
|
Unpacking tuple assignments in for statements and expr_stmts.
|
||||||
|
"""
|
||||||
if exprlist.type == 'name':
|
if exprlist.type == 'name':
|
||||||
return {exprlist.value: types}
|
return {exprlist.value: types}
|
||||||
elif exprlist.type == 'atom' and exprlist.children[0] in '([':
|
elif exprlist.type == 'atom' and exprlist.children[0] in '([':
|
||||||
return create_for_dict(evaluator, types, exprlist.children[1])
|
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 = {}
|
dct = {}
|
||||||
parts = iter(exprlist.children[:2])
|
parts = iter(exprlist.children[::2])
|
||||||
for iter_types in ordered_elements_of_iterable(evaluator, types, []):
|
for iter_types in ordered_elements_of_iterable(evaluator, types, []):
|
||||||
try:
|
try:
|
||||||
part = next(parts)
|
part = next(parts)
|
||||||
|
|||||||
@@ -1,2 +1,3 @@
|
|||||||
|
|
||||||
a, b = {'asdf': 3, 'b': 'str'}
|
a, b = {'asdf': 3, 'b': 'str'}
|
||||||
|
a
|
||||||
|
|||||||
Reference in New Issue
Block a user