unexpected keyword arguments detection

This commit is contained in:
Dave Halter
2014-05-23 15:34:16 +02:00
parent acd836f30d
commit d9f17beea5
3 changed files with 19 additions and 9 deletions

View File

@@ -14,6 +14,7 @@ CODES = {
'type-error-generator': (4, TypeError, "TypeError: 'generator' object is not subscriptable."), 'type-error-generator': (4, TypeError, "TypeError: 'generator' object is not subscriptable."),
'type-error-too-many-arguments': (5, TypeError, None), 'type-error-too-many-arguments': (5, TypeError, None),
'type-error-too-few-arguments': (6, TypeError, None), 'type-error-too-few-arguments': (6, TypeError, None),
'type-error-keyword-argument': (7, TypeError, None),
} }

View File

@@ -33,7 +33,6 @@ def get_params(evaluator, func, var_args):
# args / kwargs will just be empty arrays / dicts, respectively. # args / kwargs will just be empty arrays / dicts, respectively.
# Wrong value count is just ignored. If you try to test cases that are # 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. # not allowed in Python, Jedi will maybe not show any completions.
previous_value = value
key, value = next(var_arg_iterator, (None, None)) key, value = next(var_arg_iterator, (None, None))
while key: while key:
keys_only = True keys_only = True
@@ -68,6 +67,7 @@ def get_params(evaluator, func, var_args):
array_type = pr.Array.DICT array_type = pr.Array.DICT
if non_matching_keys: if non_matching_keys:
keys, values = zip(*non_matching_keys) keys, values = zip(*non_matching_keys)
non_matching_keys = []
elif not keys_only: elif not keys_only:
# normal param # normal param
if value is not None: if value is not None:
@@ -84,9 +84,11 @@ def get_params(evaluator, func, var_args):
# returned. # returned.
values = [] values = []
if isinstance(var_args, pr.Array): if isinstance(var_args, pr.Array):
print(var_args, var_args.start_pos, id(var_args)) #print(var_args, var_args.start_pos, id(var_args))
print('last', previous_value) #original_var_ars = var_args
m = _get_error_message(func, len(var_args)) #if len(var_args) == 0:
# print(original_var_ars)
m = _error_argument_count(func, len(var_args))
analysis.add(evaluator, 'type-error-too-few-arguments', analysis.add(evaluator, 'type-error-too-few-arguments',
var_args, message=m) var_args, message=m)
@@ -104,9 +106,14 @@ def get_params(evaluator, func, var_args):
for k in set(param_dict) - keys_used: for k in set(param_dict) - keys_used:
result.append(_gen_param_name_copy(func, var_args, param_dict[k])) result.append(_gen_param_name_copy(func, var_args, param_dict[k]))
for key, value in non_matching_keys:
m = "TypeError: %s() got an unexpected keyword argument '%s'." \
% (func.name, key)
analysis.add(evaluator, 'type-error-keyword-argument', value, message=m)
remaining_params = list(var_arg_iterator) remaining_params = list(var_arg_iterator)
if remaining_params: if remaining_params:
m = _get_error_message(func, len(func.params) + len(remaining_params)) m = _error_argument_count(func, len(func.params) + len(remaining_params))
analysis.add(evaluator, 'type-error-too-many-arguments', analysis.add(evaluator, 'type-error-too-many-arguments',
remaining_params[0][1], message=m) remaining_params[0][1], message=m)
return result return result
@@ -134,6 +141,7 @@ def _var_args_iterator(evaluator, var_args):
# *args must be some sort of an array, otherwise -> ignore # *args must be some sort of an array, otherwise -> ignore
for array in evaluator.eval_expression_list(expression_list[1:]): for array in evaluator.eval_expression_list(expression_list[1:]):
if isinstance(array, iterable.Array): if isinstance(array, iterable.Array):
#print('star', array, id(array))
for field_stmt in array: # yield from plz! for field_stmt in array: # yield from plz!
yield None, field_stmt yield None, field_stmt
elif isinstance(array, iterable.Generator): elif isinstance(array, iterable.Generator):
@@ -179,6 +187,7 @@ def _gen_param_name_copy(func, var_args, param, keys=(), values=(), array_type=N
# create an Array (-> needed for *args/**kwargs tuples/dicts) # create an Array (-> needed for *args/**kwargs tuples/dicts)
arr = pr.Array(helpers.FakeSubModule, start_pos, array_type, parent) arr = pr.Array(helpers.FakeSubModule, start_pos, array_type, parent)
#print('create', id(arr))
arr.values = values arr.values = values
key_stmts = [] key_stmts = []
for key in keys: for key in keys:
@@ -193,6 +202,6 @@ def _gen_param_name_copy(func, var_args, param, keys=(), values=(), array_type=N
return name return name
def _get_error_message(func, actual_count): def _error_argument_count(func, actual_count):
return ('TypeError: %s() takes exactly %s arguments (%%s given).' return ('TypeError: %s() takes exactly %s arguments (%s given).'
% (func.name, len(func.params))) % (func.name, len(func.params), actual_count))

View File

@@ -27,7 +27,7 @@ simple(1, 2, 3)
# ----------------- # -----------------
simple(a=1) simple(a=1)
#! 7 type-error #! 7 type-error-keyword-argument
simple(b=1) simple(b=1)
#! 10 type-error-too-many-arguments #! 10 type-error-too-many-arguments
simple(1, a=1) simple(1, a=1)