Skip to main content

Cache function results and side effects (stdout, stderr, file writes) with automatic file I/O discovery via strace or audit hooks

Project description

pycasher

Cache Python function results and their side effects — stdout, stderr, and filesystem writes — with automatic invalidation.

pip install pycasher

What makes it different

Most caching libraries cache return values. casher also captures and replays:

  • stdout/stderr printed during execution
  • Files written by the function (restored from cache on hit)
  • Files read by the function (used as cache keys — change an input file, cache auto-invalidates)

No manual file declarations needed. casher discovers file I/O automatically via strace (subprocess mode) or Python audit hooks (in-process mode).

Usage

from casher import cached, expand_input_dir

@cached
def train(data_path: str, output_path: str, lr: float = 0.01) -> dict:
    df = read_csv(data_path)
    model = fit(df, lr=lr)
    save(model, output_path)
    return {"accuracy": model.score}

# First call — runs function, traces file I/O, caches everything
result = train("train.csv", "model.pkl")

# Second call — instant replay from cache (model.pkl restored too)
result = train("train.csv", "model.pkl")

# Change train.csv — casher detects it, re-runs automatically

For directory-shaped inputs, keep the argument semantics explicit instead of making every directory Path recursive by magic:

from pathlib import Path

from casher import cached, expand_input_dir


@cached(input_files=lambda data_dir: expand_input_dir(data_dir, "*.csv"))
def build_dataset(data_dir: Path) -> int:
    return len(list(data_dir.glob("*.csv")))

Path arguments that point to files are hashed by file content for the function-argument portion of the cache key. Auto-discovered input files remain path-sensitive and content-sensitive.

Cache any shell command without code changes:

casher -- python train.py --data train.csv

Key features

  • Automatic file tracking: strace (kernel-level, catches C extensions) or audit hooks (zero overhead, Python-only)
  • Dependency invalidation: changes to imported .py files invalidate the cache
  • LRU eviction: configurable via max_cache_bytes or CASHER_MAX_CACHE_BYTES env var (default 32 GB)
  • DataFrame support: polars and pandas DataFrames serialized via Arrow IPC
  • Environment-aware: include env vars in cache key with env_vars=["MY_VAR"]
  • Structured logging: loguru INFO for every call — cache dir, hit/miss, mode, eviction
  • Explicit directory expansion helper: expand_input_dir() for stable input_files lists

Configuration

Env var Default Description
CASHER_CACHE_DIR ~/.cache/casher Cache storage directory
CASHER_MAX_CACHE_BYTES 34359738368 (32 GB) Max cache size before LRU eviction

Or set programmatically (takes priority over env vars):

from casher import configure, get_config

configure(cache_dir="/data/my_cache", max_cache_bytes=10 * 1024**3)
print(get_config())  # effective config

Platform support

Full caching on Linux only (requires strace for subprocess mode, fcntl for locking). On macOS and Windows the decorator is a transparent pass-through — functions execute normally, caching is skipped with a one-time warning.

Documentation

See documentation/ for detailed docs:

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pycasher-0.5.5.tar.gz (78.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pycasher-0.5.5-py3-none-any.whl (41.1 kB view details)

Uploaded Python 3

File details

Details for the file pycasher-0.5.5.tar.gz.

File metadata

  • Download URL: pycasher-0.5.5.tar.gz
  • Upload date:
  • Size: 78.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.9

File hashes

Hashes for pycasher-0.5.5.tar.gz
Algorithm Hash digest
SHA256 0d6542d1f144e6de3d06fdeb17ec97fc9a42e7c5ce34d0bc3a123d2237b7adcf
MD5 fd0250d41978b37b9bdd3c8f88552ae2
BLAKE2b-256 18bc04b7ce8b75d9c49fe695159747170f550013e7a682acbe9c39b40beae46d

See more details on using hashes here.

File details

Details for the file pycasher-0.5.5-py3-none-any.whl.

File metadata

  • Download URL: pycasher-0.5.5-py3-none-any.whl
  • Upload date:
  • Size: 41.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.9

File hashes

Hashes for pycasher-0.5.5-py3-none-any.whl
Algorithm Hash digest
SHA256 966a23e5cf7d712c700bc4235f478c3d3c94d84bb1519457e83442bc27223261
MD5 70c3e2b74741ead5c3f31612dbc71125
BLAKE2b-256 fb940683e9ce0d911e1337a5f50f5f4c24aaf54554bf2d10f8b323bbfd2a22d5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page