docs: def validate_params(cls, mtd_name, *args, **kwargs):
      """Validates if the given args/kwargs match the method signature. Checks if:
      - at least all required args/kwargs are given
      - no redundant args/kwargs are given
  
      Parameters
      ----------
      cls : Class
      mtd_name : str
          Name of the method whose parameters shall be validated
      args: list
          Positional arguments
      kwargs : dict
          Dict of keyword arguments
      """
      mtd = getattr(cls, mtd_name)
  
      py3_mtd_condition = (not (inspect.isfunction(mtd) or inspect.ismethod(mtd))
                           and hasattr(cls, mtd_name))
      py2_mtd_condition = (not inspect.ismethod(mtd)
                           and not isinstance(cls.__dict__[mtd_name], staticmethod))
      if (PY3 and py3_mtd_condition) or (PY2 and py2_mtd_condition):
          raise TypeError('Attribute `%s` of class `%s` must be a method. Got type `%s` instead.'
                          % (mtd_name, cls.__name__, type(mtd)))
  
      req_params, opt_params = arg_spec(cls, mtd_name)
      n_params = len(req_params) + len(opt_params)
      n_args_kwargs = len(args) + len(kwargs)
  
      for k in kwargs:
          if k not in req_params and k not in opt_params:
              raise TaskInitializationError('kwarg `%s` is not a parameter of callable `%s`.'
                                            % (k, mtd.__name__))
  
      if n_args_kwargs < len(req_params):
          raise TaskInitializationError('Not enough args/kwargs supplied for callable `%s`. '
                                        'Required args: %s' % (mtd.__name__, str(req_params)))
      if len(args) > n_params or n_args_kwargs > n_params or len(kwargs) > n_params:
          raise TaskInitializationError('Too many args/kwargs supplied for callable `%s`. '
                                        'Required args: %s' % (mtd.__name__, str(req_params)))
  
      redundant_p = [p for p in kwargs if p not in req_params[len(args):] + opt_params]
      if redundant_p:
          raise TaskInitializationError('Supplied one or more kwargs that in the signature of '
                                        'callable `%s`. Redundant kwargs: %s'
                                        % (mtd.__name__, str(redundant_p)))
  
      needed_kwargs = req_params[len(args):]
      if not all([True if p in kwargs else False for p in needed_kwargs]):
          raise TaskInitializationError('Not enough args/kwargs supplied for callable `%s`. '
                                        'Required args: %s' % (mtd.__name__, str(req_params)))