def read(self, obj):
        """
        Returns
            object: fragment
        """
        path, frag = [], obj
        for part in self.parts:
            path.append(part)
            if isinstance(frag, dict):
                try:
                    frag = frag[part]
                except KeyError as error:
                    raise NotFound(':'.join(path)) from error
            elif isinstance(frag, (list, tuple)):
                try:
                    frag = frag[int(part)]
                except IndexError as error:
                    raise NotFound(':'.join(path)) from error
                except ValueError as error:
                    raise WrongType(':'.join(path)) from error
            elif isinstance(frag, (str, int)):
                raise WrongType(':'.join(path))
            else:
                raise NotFound(':'.join(path))
        return frag