def digested_options(opts, defaults, keys=[], multikeys=[], emptycheck=True):
    """
    Helper function for the management of default options

    This is used to validate and pre-digest the parameters of functions
    taking a variable number of keyword arguments with the ``**kwargs``
    syntax.

    Parameters
    ----------
    opts : dict
        Dictionary of optional keyword arguments
    defaults : dict
        Dictionary of defaul values
    keys : list
        List of keys to extract whose value can be directly updated from the
        defaults
    multikeys : list
        List of keys to extract whose value must be recursively updated from
        the defaults dictionary (namely, value of a multikey is a dictionary
        itself)
    emptychec : boolean
        Whether to rise an error if items remain in opts after processing.

    Returns
    -------
    eopts : dict
        Dictionary of extracted and validated options. This dictionary
        contains the values from the defaults dictionary, updated with
        the values passed in opts.

    Notes
    -----
    On exit, the input dictionary opt is changed, with all the validated
    options removed from it.
    """
    out = {}
    for key in keys:
        out[key] = opts.pop(key, defaults[key])
    for key in multikeys:
        d = defaults[key].copy()
        d.update(opts.pop(key, []))
        out[key] = d
    if emptycheck and (len(opts) != 0):
        raise TypeError("Unexpected keyword argument(s) '%s'" %
                        list(opts.keys()))
    return out