class LoaderError(Exception): pass class LoaderNoDataError(LoaderError): pass class LoaderBadRequestError(LoaderError): pass class LoaderSourceError(LoaderError): pass class FileCache: def __init__(self, dir_path, filename_pattern): self.dir_path = dir_path self.pattern = filename_pattern def historical(self, date, base): path = self.dir_path / self.pattern.format(date=date.isoformat(), base=base) try: return path.open() except FileNotFoundError as error: raise LoaderNoDataError(path) from error