code: def _memoize_cache_key(args, kwargs):
      
      cache_key_list = []
  
      # hack to get around the unhashability of lists,
      # add a special case to convert them to tuples
      for arg in args:
          if type(arg) is list:
              cache_key_list.append(tuple(arg))
          else:
              cache_key_list.append(arg)
      for (k, v) in sorted(kwargs.items()):
          if type(v) is list:
              cache_key_list.append((k, tuple(v)))
          else:
              cache_key_list.append((k, v))
      return tuple(cache_key_list)
docs: Turn args tuple and kwargs dictionary into a hashable key.
  
      Expects that all arguments to a memoized function are either hashable
      or can be uniquely identified from type(arg) and repr(arg).