fleche.caches
Attributes
Exceptions
Cache refused to cache the call for some reason or other. |
Classes
Helper class that provides a standard way to create an ABC using |
|
Helper class that provides a standard way to create an ABC using |
|
Forwarding base class: all BaseCache methods delegate to |
|
Raises |
|
A cache that can only be read from. |
|
Filters |
|
A read-only view of a cache that only exposes calls matching a predicate. |
|
A cache that forces re-execution by always missing on load. |
|
Represents a combination of caches. |
|
Mixin that enforces a maximum number of cached calls with random eviction. |
|
A |
Functions
|
Reduce sub-storage expand results to a single resolved digest. |
|
Reduce sub-storage shrink results to the longest (safest) prefix. |
Module Contents
- exception fleche.caches.Rejected[source]
Bases:
ExceptionCache refused to cache the call for some reason or other.
- class fleche.caches.BaseCache[source]
Bases:
abc.ABCHelper class that provides a standard way to create an ABC using inheritance.
- abstractmethod save(call: fleche.call.Call) str[source]
- abstractmethod load(key: str) fleche.call.LazyCall[source]
- abstractmethod evict(key: str | fleche.digest.Digest) None[source]
- transfer(other: BaseCache, pop: bool = False, overwrite: bool = False) None[source]
Transfer all calls from this cache to another cache.
- Parameters:
other – The destination cache.
pop – If True, evict transferred keys from the source cache after moving.
overwrite – If True, overwrite existing entries in the target cache. If False (default), skip entries that already exist in the target.
- readonly() ReadOnlyCache[source]
Return a read-only view of this cache.
- push(cache: BaseCache) CacheStack[source]
- abstractmethod expand(key: fleche.digest.Digest | str) fleche.digest.Digest[source]
Expand a short digest prefix to its full-length digest.
- Parameters:
key (str or
Digest) – the short digest prefix to expand- Returns:
the full-length digest
- Return type:
Digest- Raises:
KeyError – if the key is not found
AmbiguousDigestError – if the prefix matches more than one entry
- abstractmethod shrink(key: fleche.digest.Digest | str) fleche.digest.Digest[source]
Find the shortest substring that is still an unambigious reference to the same call.
Warning
This is a property of how many values there are in your storage! A key returned from this function may become ambigious in the future when more values are added. Do not rely on this function in your programs, it is provided as a convenience for users only!
- Parameters:
key (str or
Digest) – the key to shorten- Returns:
shortest key possible
- Return type:
Digest- Raises:
AmbiguousDigestError – if no shorter key is possible
- abstractmethod _query(call: BaseCache._query.call) Iterable[fleche.call.LazyCall][source]
- query(template: fleche.call.QueryCall | None = None, **kwargs) fleche.query.QueryIterator[source]
Query the cache for matching calls.
Accepts either a
QueryCallas the first positional argument, or the same keyword arguments thatQueryCallaccepts. Omitted fields default toNone(wildcard). Passing both a template and keyword arguments raisesTypeError.Examples:
cache.query(name="my_func") cache.query(name="my_func", arguments={"x": 1}) cache.query(QueryCall(name="my_func")) # existing form still works cache.query() # all calls
- Returns:
- table(arguments: Iterable[str] | str | Literal[True] = (), results=False) pandas.DataFrame[source]
Return a pandas DataFrame summarizing cached calls via query().
This implementation uses a fully-wildcard Call template to retrieve all calls through
self.queryand then flattens metadata keys into top-level columns for convenience.By default, arguments and results are elided.
The DataFrame index will be the lookup key (digest) of each call. Columns are:
name: the function name
module: the module name
‘result`: if results argument is True
metadata fields are flattened and added as columns directly
If given argument names collide with any of the above columns, they are prefixed by ‘a_’. Only requested arguments are loaded from cache.
- Parameters:
arguments – add the given arguments (of the queried calls) as columns to the table. Pass
Trueto add all arguments, or a single string as a shortcut for a one-element tuple.results (bool) – if True, add results of queried calls to table
- Returns:
table of all calls on cache
- Return type:
pandas.DataFrame
- filter(predicate: Callable[[fleche.call.Call | fleche.call.LazyCall], bool] | fleche.call.QueryCall) FilteredCache[source]
Create a read-only view of this cache that only exposes calls matching the predicate.
- Parameters:
predicate – A function that takes a Call or LazyCall and returns True if it should be included in the new cache, or a QueryCall object to use as a template.
- Returns:
A read-only view of the cache.
- Return type:
- fleche.caches._combine_expand(key: Digest | str, results: Iterable[Digest]) fleche.digest.Digest[source]
Reduce sub-storage expand results to a single resolved digest.
- Raises:
KeyError – if no results were found.
AmbiguousDigestError – if results disagree on the full digest.
- fleche.caches._combine_shrink(key: Digest | str, results: Iterable[Digest]) fleche.digest.Digest[source]
Reduce sub-storage shrink results to the longest (safest) prefix.
- Raises:
KeyError – if no results were found.
- class fleche.caches.Cache[source]
Bases:
BaseCacheHelper class that provides a standard way to create an ABC using inheritance.
- save(call: fleche.call.Call) str[source]
- load(key: str) fleche.call.LazyCall[source]
- expand(key: fleche.digest.Digest | str) fleche.digest.Digest[source]
Expand a short digest prefix to its full-length digest.
- Parameters:
key (str or
Digest) – the short digest prefix to expand- Returns:
the full-length digest
- Return type:
Digest- Raises:
KeyError – if the key is not found
AmbiguousDigestError – if the prefix matches more than one entry
- shrink(key: fleche.digest.Digest | str) fleche.digest.Digest[source]
Find the shortest substring that is still an unambigious reference to the same call.
Warning
This is a property of how many values there are in your storage! A key returned from this function may become ambigious in the future when more values are added. Do not rely on this function in your programs, it is provided as a convenience for users only!
- Parameters:
key (str or
Digest) – the key to shorten- Returns:
shortest key possible
- Return type:
Digest- Raises:
AmbiguousDigestError – if no shorter key is possible
- _query(call: Cache._query.call) Iterable[fleche.call.LazyCall][source]
Query for cached calls that match a template and return decoded results.
This delegates to the underlying
CallStorage.query()using the provided templatecall. Any digested argument values and the result are decoded via this cache’s value storage before yielding.- Parameters:
call – A
Callinstance used as a template; fields set toNoneact as wildcards. For arguments and result, comparisons follow digest semantics (i.e., values are matched by their digest).- Yields:
Call | LazyCall – Matching calls with arguments and result decoded from digests where possible.
- evict(key: str | fleche.digest.Digest) None[source]
- redigest() None[source]
Ensures consistent cache keys in case digest function changed.
This may take time depending on cache size.
- gc() set[fleche.digest.Digest][source]
Evict value entries not reachable from any stored call.
Brute-force mark-and-sweep: walks every call record to build the set of directly-referenced value digests, then transitively follows destructured sub-references (via
DestructuringMixin.child_digests()on storages that satisfyHasChildDigests), and evicts everyvalueskey outside the reachable set. Call records are left untouched.- Returns:
The set of digests that were evicted from value storage.
- class fleche.caches.CacheWrapper[source]
Bases:
BaseCacheForwarding base class: all BaseCache methods delegate to
self.cache.Combine with behaviour mixins (ReadOnlyMixin, FilteringMixin) to build concrete wrapper classes without redeclaring
cache.- save(call: fleche.call.Call) str[source]
- load(key: str) fleche.call.LazyCall[source]
- evict(key: str | fleche.digest.Digest) None[source]
- expand(key: fleche.digest.Digest | str) fleche.digest.Digest[source]
Expand a short digest prefix to its full-length digest.
- Parameters:
key (str or
Digest) – the short digest prefix to expand- Returns:
the full-length digest
- Return type:
Digest- Raises:
KeyError – if the key is not found
AmbiguousDigestError – if the prefix matches more than one entry
- shrink(key: fleche.digest.Digest | str) fleche.digest.Digest[source]
Find the shortest substring that is still an unambigious reference to the same call.
Warning
This is a property of how many values there are in your storage! A key returned from this function may become ambigious in the future when more values are added. Do not rely on this function in your programs, it is provided as a convenience for users only!
- Parameters:
key (str or
Digest) – the key to shorten- Returns:
shortest key possible
- Return type:
Digest- Raises:
AmbiguousDigestError – if no shorter key is possible
- _query(call: CacheWrapper._query.call) Iterable[fleche.call.LazyCall][source]
- class fleche.caches.ReadOnlyMixin[source]
Bases:
CacheWrapperRaises
Rejectedforsaveandevict.- save(call: fleche.call.Call)[source]
- evict(key: str | fleche.digest.Digest) None[source]
- class fleche.caches.ReadOnlyCache[source]
Bases:
ReadOnlyMixinA cache that can only be read from.
- class fleche.caches.FilteringMixin[source]
Bases:
CacheWrapperFilters
loadand_queryresults by a predicate.- predicate: Callable[[fleche.call.Call | fleche.call.LazyCall], bool][source]
- load(key: str) fleche.call.LazyCall[source]
- _query(call: FilteringMixin._query.call) Iterable[fleche.call.LazyCall][source]
- class fleche.caches.FilteredCache[source]
Bases:
FilteringMixin,ReadOnlyMixinA read-only view of a cache that only exposes calls matching a predicate.
- class fleche.caches.RefreshingCache[source]
Bases:
CacheWrapperA cache that forces re-execution by always missing on load.
It forwards saves and value loads to an underlying cache, allowing new results to be stored while ensuring that existing ones are ignored for the duration of its use.
This is necessary to handle nested fleche calls during a rerun, otherwise forcing them to re-execute would be awkward.
- load(key: str) fleche.call.LazyCall[source]
- class fleche.caches.CacheStack[source]
Bases:
BaseCacheRepresents a combination of caches.
Saving will always hit the lowest level, while loading will traverse up.
- save(call: fleche.call.Call)[source]
- load(key) fleche.call.LazyCall[source]
- push(cache: BaseCache) CacheStack[source]
- evict(key: str | fleche.digest.Digest) None[source]
- expand(key: fleche.digest.Digest | str) fleche.digest.Digest[source]
Expand a short digest prefix to its full-length digest.
- Parameters:
key (str or
Digest) – the short digest prefix to expand- Returns:
the full-length digest
- Return type:
Digest- Raises:
KeyError – if the key is not found
AmbiguousDigestError – if the prefix matches more than one entry
- shrink(key: fleche.digest.Digest | str) fleche.digest.Digest[source]
Find the shortest substring that is still an unambigious reference to the same call.
Warning
This is a property of how many values there are in your storage! A key returned from this function may become ambigious in the future when more values are added. Do not rely on this function in your programs, it is provided as a convenience for users only!
- Parameters:
key (str or
Digest) – the key to shorten- Returns:
shortest key possible
- Return type:
Digest- Raises:
AmbiguousDigestError – if no shorter key is possible
- _query(call: CacheStack._query.call) Iterable[fleche.call.LazyCall][source]
Aggregate query results across the stack, avoiding duplicates.
The caches are queried from bottom to top. Results are deduplicated by their lookup key (via
Call.to_lookup_key()) and yielded in the order they are first seen.- Parameters:
call – A template
CallwhereNonefields act as wildcards.- Yields:
Call | LazyCall – Matching calls from any cache in the stack, without duplicates.
- class fleche.caches.SizeLimitedMixin[source]
Bases:
BaseCacheMixin that enforces a maximum number of cached calls with random eviction.
Combine this with
Cache(mixin first in MRO) to get a size-limited cache:@dataclass class SizeLimitedCache(SizeLimitedMixin, Cache): max_size: int
When a new call is saved and the number of cached calls exceeds
max_size, a call record is selected for eviction via_pick_eviction_target(). Value storage is intentionally left untouched.The concrete class must provide a
max_sizeinteger, which is provided automatically when mixed withCache.- _pick_eviction_target(keys: list[str]) str[source]
Select the call to evict from a sample of cached call keys.
The default implementation chooses uniformly at random. Override this method to implement a different eviction policy without touching any other part of the class.
- Parameters:
keys – A non-empty list of all tracked call keys.
- Returns:
The key of the call that should be evicted.
- evict(key: str | fleche.digest.Digest) None[source]
- class fleche.caches.SizeLimitedCache[source]
Bases:
SizeLimitedMixin,CacheA
Cachethat enforces a maximum number of cached calls.When a new call is saved and the number of cached calls exceeds
max_size, a call record is selected for eviction via_pick_eviction_target(). The default policy evicts uniformly at random; override_pick_eviction_target()to change this.- Parameters: