star args improvements

This commit is contained in:
Dave Halter
2014-12-13 08:17:38 +01:00
parent 1b48f6fbce
commit ddd4d675f6
3 changed files with 22 additions and 14 deletions

View File

@@ -74,6 +74,13 @@ class Warning(Error):
def add(evaluator, name, jedi_obj, message=None, typ=Error, payload=None): def add(evaluator, name, jedi_obj, message=None, typ=Error, payload=None):
from jedi.evaluate.iterable import MergedNodes
while isinstance(jedi_obj, MergedNodes):
if len(jedi_obj) != 1:
# TODO is this kosher?
return
jedi_obj = list(jedi_obj)[0]
exception = CODES[name][1] exception = CODES[name][1]
if _check_for_exception_catch(evaluator, jedi_obj, exception, payload): if _check_for_exception_catch(evaluator, jedi_obj, exception, payload):
return return

View File

@@ -197,7 +197,7 @@ def _get_calling_var_args(evaluator, var_args):
break break
# We never want var_args to be a tuple. This should be enough for # We never want var_args to be a tuple. This should be enough for
# now, we can change it later, if we need to. # now, we can change it later, if we need to.
if isinstance(param.var_args, pr.Array): if isinstance(param.var_args, Arguments):
var_args = param.var_args var_args = param.var_args
return var_args.argument_node or var_args.trailer return var_args.argument_node or var_args.trailer
@@ -256,12 +256,13 @@ def get_params(evaluator, func, var_args):
if param.stars == 1: if param.stars == 1:
# *args param # *args param
array_type = pr.Array.TUPLE array_type = pr.Array.TUPLE
lst_values = [iterable.MergedNodes(va_values)] lst_values = [iterable.MergedNodes(va_values)] if va_values else []
for key, va_values in var_arg_iterator: for key, va_values in var_arg_iterator:
# Iterate until a key argument is found. # Iterate until a key argument is found.
if key: if key:
var_arg_iterator.push_back((key, va_values)) var_arg_iterator.push_back((key, va_values))
break break
if va_values:
lst_values.append(iterable.MergedNodes(va_values)) lst_values.append(iterable.MergedNodes(va_values))
seq = iterable.FakeSequence(evaluator, lst_values, pr.Array.TUPLE) seq = iterable.FakeSequence(evaluator, lst_values, pr.Array.TUPLE)
values = [iterable.AlreadyEvaluated([seq])] values = [iterable.AlreadyEvaluated([seq])]
@@ -306,10 +307,10 @@ def get_params(evaluator, func, var_args):
or param.stars or param.default): or param.stars or param.default):
# add a warning only if there's not another one. # add a warning only if there's not another one.
calling_va = _get_calling_var_args(evaluator, var_args) calling_va = _get_calling_var_args(evaluator, var_args)
if calling_va.argument_node is not None: if calling_va is not None:
m = _error_argument_count(func, len(unpacked_va)) m = _error_argument_count(func, len(unpacked_va))
analysis.add(evaluator, 'type-error-too-few-arguments', analysis.add(evaluator, 'type-error-too-few-arguments',
calling_va.argument_node, message=m) calling_va, message=m)
for key, va_values in non_matching_keys.items(): for key, va_values in non_matching_keys.items():
m = "TypeError: %s() got an unexpected keyword argument '%s'." \ m = "TypeError: %s() got an unexpected keyword argument '%s'." \

View File

@@ -27,7 +27,7 @@ def nested_twice(*args1):
return nested(*args1) return nested(*args1)
nested_twice(2, 3) nested_twice(2, 3)
#! 12 type-error-too-few-arguments #! 13 type-error-too-few-arguments
nested_twice(2) nested_twice(2)
#! 19 type-error-too-many-arguments #! 19 type-error-too-many-arguments
nested_twice(2, 3, 4) nested_twice(2, 3, 4)
@@ -47,13 +47,13 @@ def kwargs_test(**kwargs):
return simple2(1, **kwargs) return simple2(1, **kwargs)
kwargs_test(c=3, b=2) kwargs_test(c=3, b=2)
#! 11 type-error-too-few-arguments #! 12 type-error-too-few-arguments
kwargs_test(c=3) kwargs_test(c=3)
#! 11 type-error-too-few-arguments #! 12 type-error-too-few-arguments
kwargs_test(b=2) kwargs_test(b=2)
#! 22 type-error-keyword-argument #! 22 type-error-keyword-argument
kwargs_test(b=2, c=3, d=4) kwargs_test(b=2, c=3, d=4)
##! 11 type-error-multiple-values ##! 13 type-error-multiple-values
kwargs_test(b=2, c=3, a=4) kwargs_test(b=2, c=3, a=4)
@@ -65,9 +65,9 @@ kwargs_nested(c=3)
kwargs_nested() kwargs_nested()
#! 19 type-error-keyword-argument #! 19 type-error-keyword-argument
kwargs_nested(c=2, d=4) kwargs_nested(c=2, d=4)
##! 13 type-error-multiple-values ##! 14 type-error-multiple-values
kwargs_nested(c=2, a=4) kwargs_nested(c=2, a=4)
#! 13 type-error-multiple-values #! 14 type-error-multiple-values
kwargs_nested(b=3, c=2) kwargs_nested(b=3, c=2)
# ----------------- # -----------------
@@ -91,15 +91,15 @@ def mixed2(*args, **kwargs):
return simple_mixed(1, *args, **kwargs) return simple_mixed(1, *args, **kwargs)
#! 6 type-error-too-few-arguments #! 7 type-error-too-few-arguments
mixed2(c=2) mixed2(c=2)
#! 6 type-error-too-few-arguments #! 7 type-error-too-few-arguments
mixed2(3) mixed2(3)
#! 13 type-error-too-many-arguments #! 13 type-error-too-many-arguments
mixed2(3, 4, 5) mixed2(3, 4, 5)
#! 13 type-error-too-many-arguments #! 13 type-error-too-many-arguments
mixed2(3, 4, c=5) mixed2(3, 4, c=5)
#! 6 type-error-multiple-values #! 7 type-error-multiple-values
mixed2(3, b=5) mixed2(3, b=5)
# ----------------- # -----------------