docs: def _get_cache(cache_file, source_file=None):
      """Get cached taxonomy using the cPickle module.
  
      No check is done at that stage.
  
      :param cache_file: full path to the file holding pickled data
      :param source_file: if we discover the cache is obsolete, we
          will build a new cache, therefore we need the source path
          of the cache
      :return: (single_keywords, composite_keywords).
      """
      timer_start = time.clock()
  
      filestream = open(cache_file, "rb")
      try:
          cached_data = cPickle.load(filestream)
          version_info = cached_data['version_info']
          if version_info['rdflib'] != rdflib.__version__:
              raise KeyError
      except (cPickle.UnpicklingError, ImportError,
              AttributeError, DeprecationWarning, EOFError):
          current_app.logger.warning(
              "The existing cache in %s is not readable. "
              "Removing and rebuilding it." % cache_file
          )
          filestream.close()
          os.remove(cache_file)
          return _build_cache(source_file)
      except KeyError:
          current_app.logger.warning(
              "The existing cache %s is not up-to-date. "
              "Removing and rebuilding it." % cache_file
          )
          filestream.close()
          os.remove(cache_file)
          if source_file and os.path.exists(source_file):
              return _build_cache(source_file)
          else:
              current_app.logger.error(
                  "The cache contains obsolete data (and it was deleted), "
                  "however I can't build a new cache, the source does not "
                  "exist or is inaccessible! - %s" % source_file
              )
      filestream.close()
  
      single_keywords = cached_data["single"]
      composite_keywords = cached_data["composite"]
  
      # the cache contains only keys of the composite keywords, not the objects
      # so now let's resolve them into objects
      for kw in composite_keywords.values():
          kw.refreshCompositeOf(single_keywords, composite_keywords)
  
      current_app.logger.debug(
          "Retrieved taxonomy from cache %s created on %s" %
          (cache_file, time.asctime(cached_data["creation_time"]))
      )
  
      current_app.logger.debug(
          "%d terms read in %.1f sec." %
          (len(single_keywords) + len(composite_keywords),
           time.clock() - timer_start)
      )
  
      return (single_keywords, composite_keywords)