code: def walk(self, sofar=None, prefix=None, depth=2):
          
          out = sofar if sofar is not None else {}
          prefix = [] if prefix is None else prefix
          for name, item in self._entries.items():
              if item._container == 'catalog' and depth > 1:
                  # recurse with default open parameters
                  try:
                      item().walk(out, prefix + [name], depth-1)
                  except Exception as e:
                      print(e)
                      pass  # ignore inability to descend
              n = '.'.join(prefix + [name])
              out[n] = item
          return out
docs: Get all entries in this catalog and sub-catalogs
  
          Parameters
          ----------
          sofar: dict or None
              Within recursion, use this dict for output
          prefix: list of str or None
              Names of levels already visited
          depth: int
              Number of levels to descend; needed to truncate circular references
              and for cleaner output
  
          Returns
          -------
          Dict where the keys are the entry names in dotted syntax, and the
          values are entry instances.