Cache#

class Cache(max_cache_size, max_key_length)#

Bases: dict[Hashable, Any]

In-memory bounded-size cache for key-value pairs with limited key lengths.

This cache:
  • Limits the total number of items (max_cache_size).

  • Skips keys whose length (len(key)) exceeds max_key_length.

  • When full, evicts the entry with the longest key if the incoming key is shorter.

Notes

  • Keys must be hashable. If a key has no length (i.e., len(key) raises TypeError), it is ignored (not cached).

  • Updating an existing key always succeeds (no eviction), even when the cache is full.

Example

>>> cache = Cache(max_cache_size=3, max_key_length=5)
>>> cache['abc'] = 1
>>> cache['def'] = 2
>>> cache['ghi'] = 3
>>> cache['abcdef'] = 4  # ignored: key too long
>>> list(cache.items())
[('abc', 1), ('def', 2), ('ghi', 3)]
Parameters:
  • max_cache_size (int)

  • max_key_length (int)

max_cache_size#

Maximum number of entries the cache can hold (<=0 disables caching).

Type:

int

max_key_length#

Maximum allowed length of any key.

Type:

int

__init__(max_cache_size, max_key_length)#

Initialize the cache.

Parameters:
  • max_cache_size (int) – Maximum entries to retain; if <= 0, all insertions are ignored.

  • max_key_length (int) – Maximum allowed length of any key.

Return type:

None

Methods

__init__(max_cache_size, max_key_length)

Initialize the cache.

clear()

copy()

fromkeys(iterable[, value])

Create a new dictionary with keys from iterable and values set to value.

get(key[, default])

Return the value for key if key is in the dictionary, else default.

items()

keys()

pop(k[,d])

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()

Remove and return a (key, value) pair as a 2-tuple.

setdefault(key[, default])

Insert key with a value of default if key is not in the dictionary.

update([E, ]**F)

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values()

clear() None.  Remove all items from D.#
copy() a shallow copy of D#
classmethod fromkeys(iterable, value=None, /)#

Create a new dictionary with keys from iterable and values set to value.

get(key, default=None, /)#

Return the value for key if key is in the dictionary, else default.

items() a set-like object providing a view on D's items#
keys() a set-like object providing a view on D's keys#
pop(k[, d]) v, remove specified key and return the corresponding value.#

If the key is not found, return the default if given; otherwise, raise a KeyError.

popitem()#

Remove and return a (key, value) pair as a 2-tuple.

Pairs are returned in LIFO (last-in, first-out) order. Raises KeyError if the dict is empty.

setdefault(key, default=None, /)#

Insert key with a value of default if key is not in the dictionary.

Return the value for key if key is in the dictionary, else default.

update([E, ]**F) None.  Update D from mapping/iterable E and F.#

If E is present and has a .keys() method, then does: for k in E.keys(): D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k]

values() an object providing a view on D's values#