docs: def load_args_and_kwargs(func, args, data=None, ignore_invalid=False):
      '''
      Detect the args and kwargs that need to be passed to a function call, and
      check them against what was passed.
      '''
      argspec = salt.utils.args.get_function_argspec(func)
      _args = []
      _kwargs = {}
      invalid_kwargs = []
  
      for arg in args:
          if isinstance(arg, dict) and arg.pop('__kwarg__', False) is True:
              # if the arg is a dict with __kwarg__ == True, then its a kwarg
              for key, val in six.iteritems(arg):
                  if argspec.keywords or key in argspec.args:
                      # Function supports **kwargs or is a positional argument to
                      # the function.
                      _kwargs[key] = val
                  else:
                      # **kwargs not in argspec and parsed argument name not in
                      # list of positional arguments. This keyword argument is
                      # invalid.
                      invalid_kwargs.append('{0}={1}'.format(key, val))
              continue
  
          else:
              string_kwarg = salt.utils.args.parse_input([arg], condition=False)[1]  # pylint: disable=W0632
              if string_kwarg:
                  if argspec.keywords or next(six.iterkeys(string_kwarg)) in argspec.args:
                      # Function supports **kwargs or is a positional argument to
                      # the function.
                      _kwargs.update(string_kwarg)
                  else:
                      # **kwargs not in argspec and parsed argument name not in
                      # list of positional arguments. This keyword argument is
                      # invalid.
                      for key, val in six.iteritems(string_kwarg):
                          invalid_kwargs.append('{0}={1}'.format(key, val))
              else:
                  _args.append(arg)
  
      if invalid_kwargs and not ignore_invalid:
          salt.utils.args.invalid_kwargs(invalid_kwargs)
  
      if argspec.keywords and isinstance(data, dict):
          # this function accepts **kwargs, pack in the publish data
          for key, val in six.iteritems(data):
              _kwargs['__pub_{0}'.format(key)] = val
  
      return _args, _kwargs