code: def function_kwargs(function_index=1, function_name=None,
                      exclude_keys='self', exclude_values=None):
      
      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
docs: 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