Skip to main content

Conditional cache is a wrapper over functools.lru_cache that allows for conditionally caching based on the output of the function.

Project description

ConditionalCache

ConditionalCache

ConditionalCache is a set of decorators, that provide conditional function memoization and selective cache clearing.

It works under the same interface that most standard cache decorators like functools.lru_cache or cachetools.ttl_cache, but unlocking a new condition parameter, that will determine if the function result is memoized or not. This feature allows for more granular control over caching behavior, useful for those use cases where we want to store the output only when certain conditions are met. As for example when checking existence in databases.

Installation

To install ConditionalCache simply run:

pip install conditional-cache

Usage

Working with ConditionalCache is as simple and straight-forward as using functools.lru_cache, as it works under the same interface.

from conditional_cache import lru_cache

# Memoize the returned element only when it is different than "Not Found"
@lru_cache(maxsize=64, condition=lambda db_value: db_value != "Not Found")
def element_exists_in_db(element_id: int) -> str:
  
  print(f"Asked to DB: {element_id}")
  # For the example let's consider that even elements exists.
  return "Found" if element_id % 2 == 0 else "Not Found"

When we will call this function, it will be execute only once for even numbers, and always for odds.

# Will be executed, and not memoized
print(f"Returned: {element_exists_in_db(element_id=1)}")
# Will be executed again
print(f"Returned: {element_exists_in_db(element_id=1)}\n")

# Will be executed and memoized
print(f"Returned: {element_exists_in_db(element_id=2)}")
# Will return the memoized result without executing again
print(f"Returned: {element_exists_in_db(element_id=2)}")
>> Asked to DB: 1
>> Returned: Not Found
>> Asked to DB: 1
>> Returned: Not Found

>> Asked to DB: 2
>> Returned: Found
>> Returned: Found

If during your execution, you perform an action that invalidate a given function result, you can actively remove that element cache:

# Will return the result that was memoized before
print(f"Returned: {element_exists_in_db(element_id=2)}\n")
# Remove the element from the cache
element_exists_in_db.cache_remove(element_id=2)

# Will be executed again and memoized
print(f"Returned: {element_exists_in_db(element_id=2)}")
# Will return the memoized result
print(f"Returned: {element_exists_in_db(element_id=2)}")
>> Returned: Found

>> Asked to DB: 2
>> Returned: Found
>> Returned: Found

API Reference

conditional_cache.lru_cache(maxsize: int = 128, typed: bool = False, condition: callable = lambda x: True)

An Least Recently Used Cache. It works the same way that functools.lru_cache but accepting conditional storage and selective item removing through <decorated_function>.cache_remove(**args)

  • maxsize: int. The maximum amount of elements to keep cached. Once the cache is full, new elements will start to override oldest ones.
  • typed: bool. Works the same way that functools.lru_cache. If True, function arguments of different types will be cached separately.
  • condition: callable. It must be a function that receives a single parameter as input (the output of the decorated method) and returns a boolean. True if the result should be cached or False if it should not.

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

conditional_cache-1.2.tar.gz (4.3 kB view details)

Uploaded Source

Built Distribution

conditional_cache-1.2-py3-none-any.whl (4.7 kB view details)

Uploaded Python 3

File details

Details for the file conditional_cache-1.2.tar.gz.

File metadata

  • Download URL: conditional_cache-1.2.tar.gz
  • Upload date:
  • Size: 4.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.0 CPython/3.12.3

File hashes

Hashes for conditional_cache-1.2.tar.gz
Algorithm Hash digest
SHA256 836247f92320e7f1a0b744480074f09cf2812edd6e7fe2619ffa788c33ef799e
MD5 dd730cae17cdf18fb9b575721305ff01
BLAKE2b-256 6150b6f5755fd0b68c78f62b6e7116b8c5da631ec4488da4cc417117797843a7

See more details on using hashes here.

File details

Details for the file conditional_cache-1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for conditional_cache-1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 973ea5ff053a5449c9c98390ae0c22dc3625fcf1e5624b1366fd1bd47cbd5eb5
MD5 ee3d6eb76ad3af72df1bd5fc19a53fb1
BLAKE2b-256 77fdccf95dbfb07bd065dcd78b081e89e71d66a712e3f371ffbaf05cb4c57ee4

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