def METHOD_NAME(*args, **kwargs):
    nargs_given = len(args)
    assert nargs_given >= nargs_min
    # allow for positional default arguments to be used
    for i in range(nargs_given, nargs):
        args = args + (fparams[i].default,)
    # positional arguments
    positional = args[:nargs]
    # merged params
    params = {**{k: v for d in args[nargs:] for k, v in d.items()}, **kwargs}
    for p, v in self.default.items():
        if p not in params:
            params[p] = v
    # check if params are known
    for p in params:
        if p not in self.default:
            raise KeyError(f"Parameter {p} is not known")
    return f(*positional, params)