<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def file_path_from_hash(self, file_hash, path=None, hash_list=None):
 """ 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. """

        # 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
        )