예제 #1
0
def _create_default_param(execution_context, param):
    if param.star_count == 1:
        result_arg = LazyKnownContext(
            iterable.FakeSequence(execution_context.evaluator, u'tuple', []))
    elif param.star_count == 2:
        result_arg = LazyKnownContext(
            iterable.FakeDict(execution_context.evaluator, {}))
    elif param.default is None:
        result_arg = LazyUnknownContext()
    else:
        result_arg = LazyTreeContext(execution_context.parent_context,
                                     param.default)
    return ExecutedParam(execution_context, param, result_arg)
예제 #2
0
 def py__iter__(self, contextualized_node=None):
     """
     While values returns the possible values for any array field, this
     function returns the value for a certain index.
     """
     if self.array_type == u'dict':
         # Get keys.
         types = NO_CONTEXTS
         for k, _ in self.get_tree_entries():
             types |= self._defining_context.eval_node(k)
         # We don't know which dict index comes first, therefore always
         # yield all the types.
         for _ in types:
             yield LazyKnownContexts(types)
     else:
         for node in self.get_tree_entries():
             if node == ':' or node.type == 'subscript':
                 # TODO this should probably use at least part of the code
                 #      of eval_subscript_list.
                 yield LazyKnownContext(
                     Slice(self._defining_context, None, None, None))
             else:
                 yield LazyTreeContext(self._defining_context, node)
         for addition in check_array_additions(self._defining_context,
                                               self):
             yield addition
예제 #3
0
    def unpack(self, funcdef=None):
        named_args = []
        for star_count, el in unpack_arglist(self.argument_node):
            if star_count == 1:
                arrays = self.context.eval_node(el)
                iterators = [_iterate_star_args(self.context, a, el, funcdef)
                             for a in arrays]
                for values in list(zip_longest(*iterators)):
                    # TODO zip_longest yields None, that means this would raise
                    # an exception?
                    yield None, get_merged_lazy_context(
                        [v for v in values if v is not None]
                    )
            elif star_count == 2:
                arrays = self.context.eval_node(el)
                for dct in arrays:
                    for key, values in _star_star_dict(self.context, dct, el, funcdef):
                        yield key, values
            else:
                if el.type == 'argument':
                    c = el.children
                    if len(c) == 3:  # Keyword argument.
                        named_args.append((c[0].value, LazyTreeContext(self.context, c[2]),))
                    else:  # Generator comprehension.
                        # Include the brackets with the parent.
                        comp = iterable.GeneratorComprehension(
                            self._evaluator, self.context, self.argument_node.parent)
                        yield None, LazyKnownContext(comp)
                else:
                    yield None, LazyTreeContext(self.context, el)

        # Reordering arguments is necessary, because star args sometimes appear
        # after named argument, but in the actual order it's prepended.
        for named_arg in named_args:
            yield named_arg
예제 #4
0
 def py__bases__(self):
     arglist = self.tree_node.get_super_arglist()
     if arglist:
         from jedi.evaluate import arguments
         args = arguments.TreeArguments(self.evaluator, self, arglist)
         return [value for key, value in args.unpack() if key is None]
     else:
         return [LazyKnownContext(compiled.create(self.evaluator, object))]
예제 #5
0
    def _imitate_items(self):
        lazy_contexts = [
            LazyKnownContext(FakeSequence(
                self.evaluator, 'tuple',
                (LazyTreeContext(self._defining_context, key_node),
                 LazyTreeContext(self._defining_context, value_node))
            )) for key_node, value_node in self._items()
        ]

        return ContextSet(FakeSequence(self.evaluator, 'list', lazy_contexts))
예제 #6
0
    def py__iter__(self):
        if type(self.obj) not in (str, list, tuple, unicode, bytes, bytearray,
                                  dict):
            # Get rid of side effects, we won't call custom `__getitem__`s.
            return

        for i, part in enumerate(self.obj):
            if i > 20:
                # Should not go crazy with large iterators
                break
            yield LazyKnownContext(create(self.evaluator, part))
예제 #7
0
파일: iterable.py 프로젝트: ctomiao2/vim
    def _imitate_items(self):
        lazy_contexts = [
            LazyKnownContext(
                FakeSequence(
                    self.evaluator, u'tuple',
                    [LazyKnownContexts(key),
                     LazyKnownContexts(value)]))
            for key, value in self._iterate()
        ]

        return ContextSet(FakeSequence(self.evaluator, u'list', lazy_contexts))
예제 #8
0
    def _eval_yield(self, yield_expr):
        if yield_expr.type == 'keyword':
            # `yield` just yields None.
            yield LazyKnownContext(compiled.create(self.evaluator, None))
            return

        node = yield_expr.children[1]
        if node.type == 'yield_arg':  # It must be a yield from.
            cn = ContextualizedNode(self, node.children[1])
            for lazy_context in cn.infer().iterate(cn):
                yield lazy_context
        else:
            yield LazyTreeContext(self, node)
예제 #9
0
    def _get_yield_lazy_context(self, yield_expr):
        if yield_expr.type == 'keyword':
            # `yield` just yields None.
            ctx = compiled.builtin_from_name(self.evaluator, u'None')
            yield LazyKnownContext(ctx)
            return

        node = yield_expr.children[1]
        if node.type == 'yield_arg':  # It must be a yield from.
            cn = ContextualizedNode(self, node.children[1])
            for lazy_context in cn.infer().iterate(cn):
                yield lazy_context
        else:
            yield LazyTreeContext(self, node)
예제 #10
0
파일: context.py 프로젝트: huohuoya/jedi
    def py__iter__(self, contextualized_node=None):
        # Python iterators are a bit strange, because there's no need for
        # the __iter__ function as long as __getitem__ is defined (it will
        # just start with __getitem__(0). This is especially true for
        # Python 2 strings, where `str.__iter__` is not even defined.
        if not self.access_handle.has_iter():
            for x in super(CompiledObject, self).py__iter__(contextualized_node):
                yield x

        access_path_list = self.access_handle.py__iter__list()
        if access_path_list is None:
            # There is no __iter__ method on this object.
            return

        for access in access_path_list:
            yield LazyKnownContext(create_from_access_path(self.evaluator, access))
예제 #11
0
파일: iterable.py 프로젝트: ctomiao2/vim
 def py__iter__(self):
     for key in self._dct:
         yield LazyKnownContext(
             compiled.create_simple_object(self.evaluator, key))
예제 #12
0
 def py__iter__(self, contextualized_node=None):
     for key in self._dct:
         yield LazyKnownContext(
             compiled.create_simple_object(self.evaluator, key))
예제 #13
0
def get_params(execution_context, var_args):
    result_params = []
    param_dict = {}
    funcdef = execution_context.tree_node
    parent_context = execution_context.parent_context

    for param in funcdef.get_params():
        param_dict[param.name.value] = param
    unpacked_va = list(var_args.unpack(funcdef))
    var_arg_iterator = PushBackIterator(iter(unpacked_va))

    non_matching_keys = defaultdict(lambda: [])
    keys_used = {}
    keys_only = False
    had_multiple_value_error = False
    for param in funcdef.get_params():
        # The value and key can both be null. There, the defaults apply.
        # args / kwargs will just be empty arrays / dicts, respectively.
        # Wrong value count is just ignored. If you try to test cases that are
        # not allowed in Python, Jedi will maybe not show any completions.
        key, argument = next(var_arg_iterator, (None, None))
        while key is not None:
            keys_only = True
            try:
                key_param = param_dict[key]
            except KeyError:
                non_matching_keys[key] = argument
            else:
                if key in keys_used:
                    had_multiple_value_error = True
                    m = (
                        "TypeError: %s() got multiple values for keyword argument '%s'."
                        % (funcdef.name, key))
                    for node in var_args.get_calling_nodes():
                        analysis.add(parent_context,
                                     'type-error-multiple-values',
                                     node,
                                     message=m)
                else:
                    keys_used[key] = ExecutedParam(execution_context,
                                                   key_param, argument)
            key, argument = next(var_arg_iterator, (None, None))

        try:
            result_params.append(keys_used[param.name.value])
            continue
        except KeyError:
            pass

        if param.star_count == 1:
            # *args param
            lazy_context_list = []
            if argument is not None:
                lazy_context_list.append(argument)
                for key, argument in var_arg_iterator:
                    # Iterate until a key argument is found.
                    if key:
                        var_arg_iterator.push_back((key, argument))
                        break
                    lazy_context_list.append(argument)
            seq = iterable.FakeSequence(execution_context.evaluator, u'tuple',
                                        lazy_context_list)
            result_arg = LazyKnownContext(seq)
        elif param.star_count == 2:
            # **kwargs param
            dct = iterable.FakeDict(execution_context.evaluator,
                                    dict(non_matching_keys))
            result_arg = LazyKnownContext(dct)
            non_matching_keys = {}
        else:
            # normal param
            if argument is None:
                # No value: Return an empty container
                if param.default is None:
                    result_arg = LazyUnknownContext()
                    if not keys_only:
                        for node in var_args.get_calling_nodes():
                            m = _error_argument_count(funcdef,
                                                      len(unpacked_va))
                            analysis.add(parent_context,
                                         'type-error-too-few-arguments',
                                         node,
                                         message=m)
                else:
                    result_arg = LazyTreeContext(parent_context, param.default)
            else:
                result_arg = argument

        result_params.append(
            ExecutedParam(execution_context, param, result_arg))
        if not isinstance(result_arg, LazyUnknownContext):
            keys_used[param.name.value] = result_params[-1]

    if keys_only:
        # All arguments should be handed over to the next function. It's not
        # about the values inside, it's about the names. Jedi needs to now that
        # there's nothing to find for certain names.
        for k in set(param_dict) - set(keys_used):
            param = param_dict[k]

            if not (non_matching_keys or had_multiple_value_error
                    or param.star_count or param.default):
                # add a warning only if there's not another one.
                for node in var_args.get_calling_nodes():
                    m = _error_argument_count(funcdef, len(unpacked_va))
                    analysis.add(parent_context,
                                 'type-error-too-few-arguments',
                                 node,
                                 message=m)

    for key, lazy_context in non_matching_keys.items():
        m = "TypeError: %s() got an unexpected keyword argument '%s'." \
            % (funcdef.name, key)
        _add_argument_issue(parent_context,
                            'type-error-keyword-argument',
                            lazy_context,
                            message=m)

    remaining_arguments = list(var_arg_iterator)
    if remaining_arguments:
        m = _error_argument_count(funcdef, len(unpacked_va))
        # Just report an error for the first param that is not needed (like
        # cPython).
        first_key, lazy_context = remaining_arguments[0]
        if var_args.get_calling_nodes():
            # There might not be a valid calling node so check for that first.
            _add_argument_issue(parent_context,
                                'type-error-too-many-arguments',
                                lazy_context,
                                message=m)
    return result_params
예제 #14
0
 def unpack(self, func=None):
     yield None, LazyKnownContext(self.instance)
     for values in self._var_args.unpack(func):
         yield values
예제 #15
0
파일: stdlib.py 프로젝트: luojinrong/jedi
 def unpack(self, func=None):
     yield None, LazyKnownContext(self._class)
     for values in self._wrapped_arguments.unpack(func):
         yield values
예제 #16
0
 def py__iter__(self):
     for access in self.access_handle.py__iter__list():
         yield LazyKnownContext(
             create_from_access_path(self.evaluator, access))
예제 #17
0
 def unpack(self, func=None):
     yield None, LazyKnownContext(self._execution_context.instance)
     for values in self._get_var_args().unpack(func):
         yield values