Cache Toolz¶
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¶
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)