Pular para conteúdo

Cache Toolz

License GPLv3+ Supported Python versions PyPI version Downloads Documentation Changelog Issue Tracker Contributing Built with Material for MkDocs

Esta biblioteca oferece um decorador que aprimora a funcionalidade das funções de cache.

O cache é uma técnica comumente usada no desenvolvimento de software para melhorar o desempenho, armazenando os resultados de chamadas de função caras ou demoradas. Com esta biblioteca, você pode aplicar facilmente o cache às suas funções usando um decorador.

O decorador fornecido por esta biblioteca verifica automaticamente se a função já foi chamada com o mesmo conjunto de argumentos antes. Se tiver, em vez de executar a função novamente, ele retornará o resultado armazenado em cache, economizando um valioso tempo de processamento. No entanto, se a função for chamada com argumentos novos ou diferentes, ela será executada normalmente e armazenará em cache o resultado para uso futuro.

Ao incorporar esse decorador de cache em seu código, você pode otimizar a execução de funções que envolvem cálculos complexos, consultas de banco de dados, chamadas de API ou quaisquer outras operações que possam se beneficiar do cache.

No geral, esta biblioteca simplifica a implementação do cache em seus aplicativos, permitindo melhorar o desempenho e reduzir o consumo de recursos de forma eficaz.

Instalação

Instale e atualize usando pip:

pip install cachetoolz

Um Exemplo

todo.py
from dataclasses import asdict, dataclass, field
from datetime import timedelta
from uuid import UUID, uuid4

from cachetoolz import cache
from cachetoolz.coder import coder

TODOS: list['Todo'] = []

@dataclass
class Todo:
    title: str
    status: bool = field(default=False, compare=False)
    id: UUID = field(default_factory=uuid4, compare=False)

# Registrando um codificador de objeto
@coder.register
class TodoSerializer:
    def encode(self, value: Todo):  # Need type annotated
        return asdict(value)

    def decode(self, value):
        return Todo(**value)

# Adicionando cache para funcionar com tempo de expiração em segundos
@cache(ttl=120, namespace='todo')
def get_one(id: UUID):
    return next(filter(lambda todo: todo.id == id, TODOS), None)

# Adicionando tempo de expiração usando timedelta
@cache(ttl=timedelta(minutes=30), namespace='todo')
def get_all():
    return TODOS

# Limpe todos os caches em determinados namespaces
@cache.clear(namespaces=['todo'])
def add_one(title, status=False):
    if (todo := Todo(title=title, status=status)) not in TODOS:
        TODOS.append(todo)