def function_kwargs(function_index=1, function_name=None,
                    exclude_keys='self', exclude_values=None):
    """
    This will return a dict of the keyword 
    arguments of the function that calls it
    :param function_index: int of how many frames back the program 
                           should look (2 will give the parent of the caller)
    :param function_name:  str of the function name (should not 
                           be used with function_index)
    :param exclude_keys:   str,list,func if not a function it 
                           will be turned into one, defaults to excluding None
    :param exclude_values: obj,list,func if not a function it will be 
                           turned into one, defaults to excluding 'self'
    :return:               dict of arguments passed into the 
                           function making this call
    """
    if not hasattr(exclude_values, '__call__'):
        _exclude_values = isinstance(exclude_values, list) and\
                          exclude_values or [exclude_values]
        exclude_values = lambda x: x in _exclude_values

    if not hasattr(exclude_keys, '__call__'):
        _exclude_keys = isinstance(exclude_keys, list) and\
                        exclude_keys or [exclude_keys]
        exclude_keys = lambda x: x in _exclude_keys

    frm = func_frame(function_index + 1, function_name)
    args = frm.f_code.co_varnames[:frm.f_code.co_argcount]
    ret = dict([(k, frm.f_locals[k]) for k in args if not exclude_keys(k) and\
                not exclude_values(frm.f_locals[k])])
    return ret