class_docstr: Custom wrapper around a Repo instance
  
  It provides a few customized methods that also cache their return
  values. For all other method access the underlying repo instance
  is used.
  
  A repository is assumed to be static. Cache invalidation must
  be done manually, if that assumption does no longer hold.
docstr: Returns whereis () for a single key
  
  Returns
  -------
  dict
    Keys are special remote IDs, values are dicts with all relevant
    whereis properties, currently ('urls' (list), 'here' (bool)).
docstr_tok: ["Returns","whereis","(",")","for","a","single","key","Returns","--","--","--","-","dict","Keys","are","special","remote","IDs",",","values","are","dicts","with","all","relevant","whereis","properties",",","currently","(","'urls","'","(","list",")",",","'here","'","(","bool",")",")","."]
code: def get_whereis_key_by_specialremote(self, key):
      """Returns whereis () for a single key
  
      Returns
      -------
      dict
        Keys are special remote IDs, values are dicts with all relevant
        whereis properties, currently ('urls' (list), 'here' (bool)).
      """
      whereis = self._repo.whereis(key, key=True, output="full")
      whereis_by_sr = {
          k: {
              prop: v[prop]
              for prop in ("urls", "here")
              if v.get(prop) not in (None, [])
          }
          for k, v in whereis.items()
      }
      return whereis_by_sr
  
imports: import logging
  import os.path
  from shutil import copyfile
  import sys
  from datalad.interface.base import Interface
  from datalad.interface.base import build_doc, eval_results
  from datalad.support.constraints import EnsureStr, EnsureNone
  from datalad.interface.common_opts import save_message_opt
  from datalad.support.param import Parameter
  from datalad.distribution.dataset import Dataset, require_dataset
  from datalad.support.annexrepo import AnnexRepo
  from datalad.support.exceptions import CapturedException
  from datalad.utils import ensure_list, get_dataset_root, Path
  from datalad.distribution.dataset import EnsureDataset, datasetmethod, resolve_path
  from functools import lru_cache
label_desc: Use image node_id 5 for calling the _CachedRepo obj's underlying member method code with example usage: obj.get_whereis_key_by_specialremote(key) and returns: whereis_by_sr