Skip to main content

functools.cache() for methods, done correctly

Project description

methodic_cache

functools.cache() for methods, done correctly.

Features

Installation

pip install methodic_cache

Usage

from methodic_cache import cached_method


class MyClass:
    @cached_method
    def my_method(self, arg1, arg2):
        return arg1 + arg2


my_obj = MyClass()
my_obj.my_method(1, 2)  # returns 3
my_obj.my_method(1, 2)  # returns 3 from the cache

Using classes with __slots__

Classes that define __slots__ need to have a __weakref__ slot to be able to be weakly referenced:

from methodic_cache import cached_method


class MyClass:
    __slots__ = ("my_attr", "__weakref__")  # <-- __weakref__ is required

    def __init__(self, my_attr):
        self.my_attr = my_attr

    @cached_method
    def my_method(self, arg1, arg2):
        print(f"Computing {self.my_attr} + {arg1} + {arg2}...")
        return self.my_attr + arg1 + arg2

my_obj = MyClass(1)
my_obj.my_method(2, 3)
# prints "Computing 1 + 2 + 3..."
# returns 6
my_obj.my_method(2, 3)
# returns 6

Custom cache backends

You can use any cache backend that implements the MutableMapping interface (e.g. dict, lru_cache, functools.lru_cache, etc.). The default cache backend is cachetools.Cache(maxsize=math.inf), which will keep the cache bounded to the lifetime of the self object.

You can use a different cache backend by passing it as the cache_factory argument to cached_method:

from methodic_cache import cached_method
from cachetools import LRUCache


class MyClass:
    @cached_method(cache_factory=lambda: LRUCache(maxsize=1))
    def my_method(self, arg1, arg2):
        print(f"Computing {arg1} + {arg2}...")
        return arg1 + arg2


my_obj = MyClass()
my_obj.my_method(1, 1)
# prints Computing 1 + 1...
# returns 2
my_obj.my_method(1, 1)
# returns 2
my_obj.my_method(2, 2)
# prints Computing 2 + 2...
# returns 4
my_obj.my_method(1, 1)  # <-- this will be recomputed because the cache is full
# prints Computing 1 + 1...
# returns 2

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

methodic_cache-0.2.0.tar.gz (5.2 kB view details)

Uploaded Source

Built Distribution

methodic_cache-0.2.0-py3-none-any.whl (5.1 kB view details)

Uploaded Python 3

File details

Details for the file methodic_cache-0.2.0.tar.gz.

File metadata

  • Download URL: methodic_cache-0.2.0.tar.gz
  • Upload date:
  • Size: 5.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.3.1 CPython/3.11.1 Darwin/22.3.0

File hashes

Hashes for methodic_cache-0.2.0.tar.gz
Algorithm Hash digest
SHA256 17bfee791b2f72c2cfdc9d1b5c131d3747770b1f794fd5b931ac12f3dceea932
MD5 a2e2573977d084e56bcea998353fb5f6
BLAKE2b-256 757f4142705a8050b57ad92146bf48bb083eb74d19ab07008cd9e79fdd241ece

See more details on using hashes here.

File details

Details for the file methodic_cache-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: methodic_cache-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 5.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.3.1 CPython/3.11.1 Darwin/22.3.0

File hashes

Hashes for methodic_cache-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8dadde6400740edd75da1d6a7a4fbd7defbc1173be733c12d5d0082235471c2d
MD5 917eb82dba2a5e1d19491992bd5e1b5a
BLAKE2b-256 5a775c960971720071289c5e7dc63e5e0063c060678d955ade5a38405a6e8109

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