Skip to main content

Persistent cache for Python cachetools.

Project description

from shelved_cache import PersistentCache

Shelved Cache

Tests codecov PyPI version Downloads

Persistent cache implementation for Python cachetools.

Behaves like any Cache implementation, but entries are persisted to disk.

Original repository: https://github.com/mariushelf/shelved_cache

Usage example

from shelved_cache import PersistentCache
from cachetools import LRUCache

filename = 'mycache'

# create persistency around an LRUCache
pc = PersistentCache(LRUCache, filename=filename, maxsize=2)

# we can now use the cache like a normal LRUCache.
# But: the cache is persisted to disk.
pc["a"] = 42
pc["b"] = 43

assert pc["a"] == 42
assert pc["b"] == 43

# close the file
pc.close()

# Now in the same script or in another script, we can re-load the cache:
pc2 = PersistentCache(LRUCache, filename=filename, maxsize=2)
assert pc2["a"] == 42
assert pc2["b"] == 43

Use as a decorator

Just like a regular cachetools.Cache, the PersistentCache can be used with cachetools' cached decorator:

import cachetools
from shelved_cache import PersistentCache
from cachetools import LRUCache

filename = 'mycache'
pc = PersistentCache(LRUCache, filename, maxsize=2)

@cachetools.cached(pc)
def square(x):
    print("called")
    return x * x

assert square(3) == 9
# outputs "called"
assert square(3) == 9
# no output because the cache is used

Note: decorating multiple functions

If you want to decorate multiple functions, you need to use a new instance of PersistentCache for each function. Make sure that each cache uses a different file name.

import cachetools
from shelved_cache import PersistentCache
from cachetools import LRUCache

@cachetools.cached(PersistentCache(LRUCache, "square.cache", maxsize=100))
def square(x):
    return x * x

@cachetools.cached(PersistentCache(LRUCache, "cube.cache", maxsize=100))
def cube(x):
    return x * x * x

assert square(2) == 4
assert cube(2) == 8

Features

persistent cache

See usage examples above.

Async decorators

The package contains equivalents for cachetools' cached and cachedmethod decorators which support wrapping async methods. You can find them in the decorators submodule.

They support both synchronous and asynchronous functions and methods.

Examples:

from shelved_cache import cachedasyncmethod
from cachetools import LRUCache

class A:
    # decorate an async method:
    @cachedasyncmethod(lambda self: LRUCache(2))
    async def asum(self, a, b):
        return a + b

a = A()
assert await a.asum(1, 2) == 3
    
class S:
    @cachedasyncmethod(lambda self: LRUCache(2))
    def sum(self, a, b):
        return a + b

s = S()
assert s.sum(1, 2) == 3

Support for lists as function arguments

Using the autotuple_hashkey function, list arguments are automatically converted to tuples, so that they support hashing.

Example:

from cachetools import cached, LRUCache
from shelved_cache.keys import autotuple_hashkey

@cached(LRUCache(2), key=autotuple_hashkey)
def sum(values):
    return values[0] + values[1]

# fill cache
assert sum([1, 2]) == 3

# access cache
assert sum([1, 2]) == 3

Changelog

0.4.0

  • drop support for Python 3.7 and 3.8
  • add support for Python 3.12 and 3.13
    • note: shelved_cache does not seem to work with Python 3.13 on Windows
  • note about decorating multiple functions in the README
  • improvement in async decorators

0.3.1

  • fix for Windows users
  • add Windows and MacOS to test suite

0.3.0

  • add support for Python 3.10 and 3.11
  • better error message when trying to use the same file for multiple caches
  • CI/CD pipeline
  • fixes for documentation

0.2.1

  • improved error handling

Acknowledgements

License

Author: Marius Helf (helfsmarius@gmail.com)

License: MIT -- see LICENSE

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

shelved_cache-0.4.0.tar.gz (6.8 kB view details)

Uploaded Source

Built Distribution

shelved_cache-0.4.0-py3-none-any.whl (8.1 kB view details)

Uploaded Python 3

File details

Details for the file shelved_cache-0.4.0.tar.gz.

File metadata

  • Download URL: shelved_cache-0.4.0.tar.gz
  • Upload date:
  • Size: 6.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.7

File hashes

Hashes for shelved_cache-0.4.0.tar.gz
Algorithm Hash digest
SHA256 59c003f715d69f7bfadf461b68fae262db39cf6ab71d288dfeb24cc8637abece
MD5 5f6f78f366aeccf52b6de363e246e039
BLAKE2b-256 35f8f305abd2649539a059147df87fbce38ae2aae15fe982010a8f7162a6fe6b

See more details on using hashes here.

File details

Details for the file shelved_cache-0.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for shelved_cache-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 37eb48da1b91dee27157a50a045cb433dc6486528279804e6189fd7a2d755a5e
MD5 e76efdd19ea754ecb2e744e483387422
BLAKE2b-256 6c0179f4dbc62b3e10293e4b5b3ac3bae39302979c3632e5b89590b1c8f0e864

See more details on using hashes here.

Supported by

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