Open an IO-like object for `path`.

        .. note::

            Mode *must* be either 'r' or 'w', as the underlying objects
            do not understand the full range of modes.

        :param path: The path to open.
        :param mode: The mode of the file being opened, either 'r' or 'w'.

def open(self, path: str, mode: str='r') -> IO:
        """Open an IO-like object for `path`.

        .. note::

            Mode *must* be either 'r' or 'w', as the underlying objects
            do not understand the full range of modes.

        :param path: The path to open.
        :param mode: The mode of the file being opened, either 'r' or 'w'.
        """
        entry = self.path_map.get(path)
        if entry is None:
            raise FileNotFoundError()

        if isinstance(entry, str):
            with open(entry, 'rb' if mode == 'r' else mode) as source:
                yield source
        elif isinstance(entry, ZipFile):
            yield io.BytesIO(entry.read(path))
        else:
            raise NotImplementedError()