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):
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]
if _check_for_exception_catch(evaluator, jedi_obj, exception, payload):
return

View File

@@ -197,7 +197,7 @@ def _get_calling_var_args(evaluator, var_args):
break
# We never want var_args to be a tuple. This should be enough for
# 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
return var_args.argument_node or var_args.trailer
@@ -256,12 +256,13 @@ def get_params(evaluator, func, var_args):
if param.stars == 1:
# *args param
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:
# Iterate until a key argument is found.
if key:
var_arg_iterator.push_back((key, va_values))
break
if va_values:
lst_values.append(iterable.MergedNodes(va_values))
seq = iterable.FakeSequence(evaluator, lst_values, pr.Array.TUPLE)
values = [iterable.AlreadyEvaluated([seq])]
@@ -306,10 +307,10 @@ def get_params(evaluator, func, var_args):
or param.stars or param.default):
# add a warning only if there's not another one.
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))
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():
m = "TypeError: %s() got an unexpected keyword argument '%s'." \

View File

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