From 7532f52cdde8a4fd8354e8e26e7a204da5ac9e82 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sat, 25 Oct 2014 12:50:51 +0200 Subject: [PATCH] Understanding implicit tuple returns (testlist) --- jedi/evaluate/__init__.py | 3 ++- jedi/evaluate/iterable.py | 6 +++--- jedi/parser/representation.py | 9 ++++++--- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 822f0dde..947add09 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -180,6 +180,7 @@ class Evaluator(object): return types def eval_element(self, element): + debug.dbg('eval_element %s', element) if isinstance(element, (pr.Name, pr.Literal)) or pr.is_node(element, 'atom'): return self._eval_atom(element) elif element.type == python_symbols.power: @@ -190,7 +191,7 @@ class Evaluator(object): types = self._eval_trailer(types, trailer) return types - elif pr.is_node(element, 'testlist_star_expr'): + elif pr.is_node(element, 'testlist_star_expr', 'testlist'): # The implicit tuple in statements. return [iterable.Array(self, element, pr.Array.TUPLE)] else: diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index 0dcb9e9b..ab1f8d16 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -137,13 +137,13 @@ class Array(use_metaclass(CachedMetaClass, IterableWrapper)): return None # We don't know the length, because of appends. @memoize_default(NO_DEFAULT) - def get_index_types(self, index=()): + def get_index_types(self, evaluator, index=()): """ Get the types of a specific index or all, if not given. :param index: A subscriptlist node (or subnode). """ - indexes = create_indexes_or_slices(self._evaluator, index) + indexes = create_indexes_or_slices(evaluator, index) lookup_done = False types = [] for index in indexes: @@ -213,7 +213,7 @@ class Array(use_metaclass(CachedMetaClass, IterableWrapper)): return self._items() def _items(self): - if pr.is_node(self._array_node, 'testlist_comp') or pr.is_node(self._array_node, 'testlist_star_expr'): + if pr.is_node(self._array_node, 'testlist_comp', 'testlist_star_expr', 'testlist'): return self._array_node.children[::2] elif pr.is_node(self._array_node, 'dictorsetmaker'): kv = [] diff --git a/jedi/parser/representation.py b/jedi/parser/representation.py index 1a43b745..5bfaa087 100644 --- a/jedi/parser/representation.py +++ b/jedi/parser/representation.py @@ -56,9 +56,12 @@ from jedi.parser.pytree import python_symbols, type_repr SCOPE_CONTENTS = 'asserts', 'subscopes', 'imports', 'statements', 'returns' -def is_node(node, symbol_name): - return isinstance(node, Node) \ - and getattr(python_symbols, symbol_name) == node.type +def is_node(node, *symbol_names): + if isinstance(node, Node): + for symbol_name in symbol_names: + if getattr(python_symbols, symbol_name) == node.type: + return True + return False def filter_after_position(names, position):