def get_func_full_args(func):
if six.PY2:<EOL><INDENT>argspec = inspect.getargspec(func)<EOL>args = argspec.args[<NUM_LIT:1>:]  <EOL>defaults = argspec.defaults or []<EOL>no_default = args[:len(args) - len(defaults)]<EOL>with_default = args[len(args) - len(defaults):]<EOL>args = [(arg,) for arg in no_default] + zip(with_default, defaults)<EOL>varargs = [('<STR_LIT:*>' + argspec.varargs,)] if argspec.varargs else []<EOL>kwargs = [('<STR_LIT>' + argspec.keywords,)] if argspec.keywords else []<EOL>return args + varargs + kwargs<EOL><DEDENT>sig = inspect.signature(func)<EOL>args = []<EOL>for arg_name, param in sig.parameters.items():<EOL><INDENT>name = arg_name<EOL>if name == '<STR_LIT>':<EOL><INDENT>continue<EOL><DEDENT>if param.kind == inspect.Parameter.VAR_POSITIONAL:<EOL><INDENT>name = '<STR_LIT:*>' + name<EOL><DEDENT>elif param.kind == inspect.Parameter.VAR_KEYWORD:<EOL><INDENT>name = '<STR_LIT>' + name<EOL><DEDENT>if param.default != inspect.Parameter.empty:<EOL><INDENT>args.append((name, param.default))<EOL><DEDENT>else:<EOL><INDENT>args.append((name,))<EOL><DEDENT><DEDENT>return args<EOL>
Return a list of (argument name, default value) tuples. If the argument
does not have a default value, omit it in the tuple. Arguments such as
*args and **kwargs are also included.