A decorator for caching functions that provides persistence to JSON, pickle, or SQLite
Project description
persistent-cache-decorator
Table of Contents
Installation
pip install persistent-cache-decorator
Usage
from __future__ import annotations
import time
from persistent_cache.backend import CacheBackend
from persistent_cache.decorators import json_cache
from persistent_cache.decorators import persistent_cache
@persistent_cache(minutes=4)
def long_func(n: int) -> str:
"""Long Func Documentation."""
# Long function
time.sleep(n)
return f"{n}"
# reveal_type(long_func)
# Runtime type is "_persistent_cache"
# <persistent_cache_decorator._persistent_cache object at 0x10468be50>
# Call function(takes 5 seconds)
long_func(5)
"5"
# Call function again (takes 0 seconds)
long_func(5)
"5"
# Bypass caching(takes 5 seconds)
long_func.no_cache_call(5)
"5"
# Call function again (takes 0 seconds)
long_func(5)
"5"
# Clear cache for this function
long_func.cache_clear()
# Call function(takes 5 seconds)
long_func(5)
Cached Property
from typing import NamedTuple # noqa: E402
from persistent_cache.decorators import json_cached_property # noqa: E402
# To cache instance methods, use the json_cache decorator you can do the following:
# Reference: https://www.youtube.com/watch?v=sVjtp6tGo0g
class Pet:
def __init__(self, name: str, age: int) -> None:
self.name = name
self.age = age
# creating the cache function this way will allow the cache to be cleared using the instance
# It will also only use the arguments as the key
self.online_information = json_cache(days=2)(self._online_information)
def _online_information(self, source: str) -> int:
# Something that takes a long time
return len(source)
pet = Pet("Rex", 5)
pet.online_information(source="https://api.github.com/users/rex")
pet.online_information.cache_clear()
# NEW: or you can use the json_cached_property decorator to cache the result of a method
# This makes use of Python's Descriptors: https://www.youtube.com/watch?v=vBys0SwYvCQ
class Person(NamedTuple):
name: str
age: int
# The decorator works with Namedtuples as well as with classes
@json_cached_property(days=2)
def online_information(self, source: str) -> int:
# Something that takes a long time
return len(source)
person = Person("John", 30)
# The following call will cache the result using the class instance as well as the arguments as the key # noqa: E501
person.online_information(source="https://api.github.com/users/john")
# To clear the cache, use the method from the class directly
Person.online_information.cache_clear()
Creating a custom cache backend
from typing_extensions import Any # noqa: E402
from typing import Callable # noqa: E402
from persistent_cache.decorators import cache_decorator_factory # noqa: E402
from typing import TYPE_CHECKING # noqa: E402
if TYPE_CHECKING:
import datetime
from persistent_cache.decorators import _R
# Define a custom cache backend
class RedisCacheBackend(CacheBackend):
def get_cache_or_call( # type: ignore[empty-body]
self,
*,
func: Callable[..., _R],
args: tuple[Any, ...],
kwargs: dict[str, Any],
lifespan: datetime.timedelta,
) -> _R:
...
def del_func_cache(self, *, func: Callable[..., Any]) -> None:
...
# Singleton Instance
REDIS_CACHE_BACKEND = RedisCacheBackend()
# Quick way of defining a decorator. You can use this if you want multiple decorators with different cache durations. # noqa: E501
redis_cache = cache_decorator_factory(backend=REDIS_CACHE_BACKEND)
@redis_cache(days=1)
def foo(time: float) -> float:
from time import sleep
sleep(time)
return time
License
persistent-cache-decorator
is distributed under the terms of the MIT license.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Close
Hashes for persistent_cache_decorator-0.1.4.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 008a54729cecf16a149a5176de8a7ea45dd59eaccd90eea4ec4b9d06c7b88418 |
|
MD5 | a3f8b0e436a8edafe23c2e1c74d0f14b |
|
BLAKE2b-256 | c18334f1fddd3b2604a8ca14b518c84b9c6f0f7328e2b1a43a81e0eef1dba405 |
Close
Hashes for persistent_cache_decorator-0.1.4-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 041c410fbea9f66ddb23383958681e25fdc0b3163974e47ae0afe788719dd676 |
|
MD5 | fbefc1b682552f253f7d321ca890e434 |
|
BLAKE2b-256 | 949cf3743b8df922a767daa1193c6ef398bc593c110e9fd70fba0ac09b4da3de |