code: def function_parser(function, parser):
      
  
      # Store the function pointer on the parser for later use
      parser.set_defaults(func=function)
  
      # Get the help text and parse it for params
      help_text = inspect.getdoc(function)
      main_text, params_help = parser_help_text(help_text)
  
      # Get the function information
      args, varargs, keywords, defaults = inspect.getargspec(function)
      if args is None:
          args = []
  
      if defaults is None:
          defaults = []
  
      # If the function is a class method, it will have a self that needs to be removed
      if len(args) and args[0] == 'self':
          args.pop(0)
  
      # Work out whether the argument has a default by subtracting the length
      # of the default args from the number of arguments
      num_required_args = len(args) - len(defaults)
      for idx, arg in enumerate(args):
          if idx < num_required_args:
              arg_name, arg_params = calculate_default_type(arg, False, None, params_help)
          else:
              default_value = defaults[idx - num_required_args]
              arg_name, arg_params = calculate_default_type(arg, True, default_value, params_help)
  
          parser.add_argument(arg_name, **arg_params)
docs: This function parses a function and adds its arguments to the supplied parser