[O] Cache only on success
This commit is contained in:
@@ -3,7 +3,7 @@ import hashlib
|
||||
from pathlib import Path
|
||||
from functools import wraps
|
||||
|
||||
def _disk_cache_decorator(subdir_name: str, ext: str, read_func, write_func):
|
||||
def _disk_cache_decorator(subdir_name: str, ext: str, read_func, write_func, should_cache = None):
|
||||
"""
|
||||
Generic internal caching decorator handling filename hashing and io abstraction.
|
||||
"""
|
||||
@@ -30,19 +30,20 @@ def _disk_cache_decorator(subdir_name: str, ext: str, read_func, write_func):
|
||||
|
||||
result = func(*args, **kwargs)
|
||||
|
||||
cache_p.parent.mkdir(parents=True, exist_ok=True)
|
||||
write_func(cache_p, result)
|
||||
|
||||
# Write arguments to a .txt file for easy lookup
|
||||
txt_p = cache_p.with_suffix('.txt')
|
||||
txt_p.write_text(f"Args: {args}\nKwargs: {kwargs}", encoding="utf-8")
|
||||
if should_cache is None or should_cache(result):
|
||||
cache_p.parent.mkdir(parents=True, exist_ok=True)
|
||||
write_func(cache_p, result)
|
||||
|
||||
# Write arguments to a .txt file for easy lookup
|
||||
txt_p = cache_p.with_suffix('.txt')
|
||||
txt_p.write_text(f"Args: {args}\nKwargs: {kwargs}", encoding="utf-8")
|
||||
|
||||
return result
|
||||
return wrapper
|
||||
return decorator
|
||||
|
||||
|
||||
def with_disk_cache(subdir_name: str):
|
||||
def with_disk_cache(subdir_name: str, should_cache = None):
|
||||
"""
|
||||
A decorator to cache function results to a local JSON file.
|
||||
The cache file is stored in `data/<subdir_name>/<key>.json`.
|
||||
@@ -51,11 +52,12 @@ def with_disk_cache(subdir_name: str):
|
||||
subdir_name,
|
||||
".json",
|
||||
read_func=lambda p: json.loads(p.read_text(encoding="utf-8")),
|
||||
write_func=lambda p, res: p.write_text(json.dumps(res, ensure_ascii=False, indent=2), encoding="utf-8")
|
||||
write_func=lambda p, res: p.write_text(json.dumps(res, ensure_ascii=False, indent=2), encoding="utf-8"),
|
||||
should_cache=should_cache
|
||||
)
|
||||
|
||||
|
||||
def with_binary_disk_cache(subdir_name: str, ext: str = ".bin"):
|
||||
def with_binary_disk_cache(subdir_name: str, ext: str = ".bin", should_cache = None):
|
||||
"""
|
||||
A decorator to cache binary function results to a local file.
|
||||
The cache file is stored in `data/<subdir_name>/<key><ext>`.
|
||||
@@ -64,5 +66,6 @@ def with_binary_disk_cache(subdir_name: str, ext: str = ".bin"):
|
||||
subdir_name,
|
||||
ext,
|
||||
read_func=lambda p: p.read_bytes(),
|
||||
write_func=lambda p, res: p.write_bytes(res)
|
||||
write_func=lambda p, res: p.write_bytes(res),
|
||||
should_cache=should_cache
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user