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)))