import tempfile import os import time import hashlib import shutil cache_dir = os.path.join(tempfile.gettempdir(), "cache") os.makedirs(cache_dir, exist_ok=True) time_filename = "update_time" max_cache = 5 def deterministic_hash(obj): hash_object = hashlib.sha256() hash_object.update(str(obj).encode()) return hash_object.hexdigest()[0:20] def get_dirs(): dirs = [ os.path.join(cache_dir, dir) for dir in os.listdir(cache_dir) if os.path.isdir(os.path.join(cache_dir, dir)) ] return dirs def get_time(dir): try: timefile = os.path.join(dir, time_filename) t = float(open(timefile, encoding="utf-8").read()) return t except FileNotFoundError: # handle the error as needed, for now we'll just return a default value return float( "inf" ) # This ensures that this directory will be the first to be removed if required def write_time(dir): timefile = os.path.join(dir, time_filename) t = time.time() print(t, file=open(timefile, "w", encoding="utf-8"), end="") def argmin(iterable): return min(enumerate(iterable), key=lambda x: x[1])[0] def remove_extra(): dirs = get_dirs() for dir in dirs: if not os.path.isdir( dir ): # This line might be redundant now, as get_dirs() ensures only directories are returned os.remove(dir) try: get_time(dir) except BaseException: shutil.rmtree(dir) while True: dirs = get_dirs() if len(dirs) <= max_cache: break times = [get_time(dir) for dir in dirs] arg = argmin(times) shutil.rmtree(dirs[arg]) def is_cached(hash_key): dir = os.path.join(cache_dir, hash_key) return os.path.exists(dir) def create_cache(hash_key): dir = os.path.join(cache_dir, hash_key) os.makedirs(dir, exist_ok=True) write_time(dir) def load_paragraph(hash_key, hash_key_paragraph): filename = os.path.join(cache_dir, hash_key, hash_key_paragraph) if os.path.exists(filename): return open(filename, encoding="utf-8").read() else: return None def write_paragraph(hash_key, hash_key_paragraph, paragraph): filename = os.path.join(cache_dir, hash_key, hash_key_paragraph) print(paragraph, file=open(filename, "w", encoding="utf-8"), end="")