def _check_and_execute(func, *args, **kwargs):
convargs = []<EOL>for i, arg in enumerate(args):<EOL><INDENT>val = func.metadata.convert_positional_argument(i, arg)<EOL>convargs.append(val)<EOL><DEDENT>convkw = {}<EOL>for key, val in kwargs:<EOL><INDENT>convkw[key] = func.metadata.convert_argument(key, val)<EOL><DEDENT>if not func.metadata.spec_filled(convargs, convkw):<EOL><INDENT>raise ValidationError("<STR_LIT>", function=func.metadata.name, signature=func.metadata.signature())<EOL><DEDENT>retval = func(*convargs, **convkw)<EOL>return retval<EOL>
Check the type of all parameters with type information, converting
as appropriate and then execute the function.