code: def file_path_from_hash(self, file_hash, path=None, hash_list=None):
          
          # first, non-recursive call - parse `file_hash`
          if hash_list is None:
              hash_list = list(file_hash)
  
          if not hash_list:
              raise IOError("Directory structure is too full!")
  
          # first, non-recursive call - look for subpath of `self.path`
          if not path:
              path = os.path.join(
                  self.path,
                  hash_list.pop(0)
              )
  
          files = os.listdir(path)
  
          # is the file/unpacked archive in this `path`?
          if file_hash in files:
              full_path = os.path.join(path, file_hash)
  
              if os.path.isfile(full_path):
                  return PathAndHash(path=full_path, hash=file_hash)
  
              return PathAndHash(path=full_path + "/", hash=file_hash)
  
          # end of recursion, if there are no more directories to look into
          next_path = os.path.join(path, hash_list.pop(0))
          if not os.path.exists(next_path):
              raise IOError("File not found in the structure.")
  
          # look into subdirectory
          return self.file_path_from_hash(
              file_hash=file_hash,
              path=next_path,
              hash_list=hash_list
          )
docs: For given `file_hash`, return path on filesystem.
  
          Args:
              file_hash (str): Hash of the file, for which you wish to know the
                        path.
              path (str, default None): Recursion argument, don't set this.
              hash_list (list, default None): Recursion argument, don't set this.
  
          Returns:
              str: Path for given `file_hash` contained in :class:`.PathAndHash`\
                   object.
  
          Raises:
              IOError: If the file with corresponding `file_hash` is not in \
                       storage.