Skip to content

Commit 89c3009

Browse files
kuragatkem
authored andcommitted
Add the keys.typedmethodkey decorator
Closes: #296
1 parent d8b5c60 commit 89c3009

File tree

3 files changed

+34
-23
lines changed

3 files changed

+34
-23
lines changed

docs/index.rst

+7-1
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ functions with the :func:`cached` and :func:`cachedmethod` decorators:
491491

492492
.. autofunction:: methodkey
493493

494-
This function is equivalent to :func:`hashkey`, but ignores its
494+
This function is similar to :func:`hashkey`, but ignores its
495495
first positional argument, i.e. `self` when used with the
496496
:func:`cachedmethod` decorator.
497497

@@ -502,6 +502,12 @@ functions with the :func:`cached` and :func:`cachedmethod` decorators:
502502
``typedkey(3)`` and ``typedkey(3.0)`` will return different
503503
results.
504504

505+
.. autofunction:: typedmethodkey
506+
507+
This function is similar to :func:`typedkey`, but ignores its
508+
first positional argument, i.e. `self` when used with the
509+
:func:`cachedmethod` decorator.
510+
505511
These functions can also be helpful when implementing custom key
506512
functions for handling some non-hashable arguments. For example,
507513
calling the following function with a dictionary as its `env` argument

src/cachetools/keys.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Key functions for memoizing decorators."""
22

3-
__all__ = ("hashkey", "methodkey", "typedkey")
3+
__all__ = ("hashkey", "methodkey", "typedkey", "typedmethodkey")
44

55

66
class _HashedTuple(tuple):
@@ -55,3 +55,8 @@ def typedkey(*args, **kwargs):
5555
key += tuple(type(v) for v in args)
5656
key += tuple(type(v) for _, v in sorted(kwargs.items()))
5757
return key
58+
59+
60+
def typedmethodkey(self, *args, **kwargs):
61+
"""Return a typed cache key for use with cached methods."""
62+
return typedkey(*args, **kwargs)

tests/test_cachedmethod.py

+21-21
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ def get(self, value):
1414
self.count += 1
1515
return count
1616

17-
@cachedmethod(lambda self: self.cache, key=keys.typedkey)
18-
def get_typed(self, value):
17+
@cachedmethod(lambda self: self.cache, key=keys.typedmethodkey)
18+
def get_typedmethod(self, value):
1919
count = self.count
2020
self.count += 1
2121
return count
@@ -67,16 +67,16 @@ def test_dict(self):
6767
cached.cache.clear()
6868
self.assertEqual(cached.get(1), 2)
6969

70-
def test_typed_dict(self):
70+
def test_typedmethod_dict(self):
7171
cached = Cached(LRUCache(maxsize=2))
7272

73-
self.assertEqual(cached.get_typed(0), 0)
74-
self.assertEqual(cached.get_typed(1), 1)
75-
self.assertEqual(cached.get_typed(1), 1)
76-
self.assertEqual(cached.get_typed(1.0), 2)
77-
self.assertEqual(cached.get_typed(1.0), 2)
78-
self.assertEqual(cached.get_typed(0.0), 3)
79-
self.assertEqual(cached.get_typed(0), 4)
73+
self.assertEqual(cached.get_typedmethod(0), 0)
74+
self.assertEqual(cached.get_typedmethod(1), 1)
75+
self.assertEqual(cached.get_typedmethod(1), 1)
76+
self.assertEqual(cached.get_typedmethod(1.0), 2)
77+
self.assertEqual(cached.get_typedmethod(1.0), 2)
78+
self.assertEqual(cached.get_typedmethod(0.0), 3)
79+
self.assertEqual(cached.get_typedmethod(0), 4)
8080

8181
def test_lru(self):
8282
cached = Cached(LRUCache(maxsize=2))
@@ -90,16 +90,16 @@ def test_lru(self):
9090
cached.cache.clear()
9191
self.assertEqual(cached.get(1), 2)
9292

93-
def test_typed_lru(self):
93+
def test_typedmethod_lru(self):
9494
cached = Cached(LRUCache(maxsize=2))
9595

96-
self.assertEqual(cached.get_typed(0), 0)
97-
self.assertEqual(cached.get_typed(1), 1)
98-
self.assertEqual(cached.get_typed(1), 1)
99-
self.assertEqual(cached.get_typed(1.0), 2)
100-
self.assertEqual(cached.get_typed(1.0), 2)
101-
self.assertEqual(cached.get_typed(0.0), 3)
102-
self.assertEqual(cached.get_typed(0), 4)
96+
self.assertEqual(cached.get_typedmethod(0), 0)
97+
self.assertEqual(cached.get_typedmethod(1), 1)
98+
self.assertEqual(cached.get_typedmethod(1), 1)
99+
self.assertEqual(cached.get_typedmethod(1.0), 2)
100+
self.assertEqual(cached.get_typedmethod(1.0), 2)
101+
self.assertEqual(cached.get_typedmethod(0.0), 3)
102+
self.assertEqual(cached.get_typedmethod(0), 4)
103103

104104
def test_nospace(self):
105105
cached = Cached(LRUCache(maxsize=0))
@@ -141,10 +141,10 @@ def __add__(self, other):
141141
self.assertEqual(cached.get(1), 2)
142142
self.assertEqual(cached.get(1.0), 2)
143143

144-
ref = cached.get_typed(1)
144+
ref = cached.get_typedmethod(1)
145145
self.assertEqual(ref, 3)
146-
self.assertEqual(cached.get_typed(1), 3)
147-
self.assertEqual(cached.get_typed(1.0), 4)
146+
self.assertEqual(cached.get_typedmethod(1), 3)
147+
self.assertEqual(cached.get_typedmethod(1.0), 4)
148148

149149
cached.cache.clear()
150150
self.assertEqual(cached.get(1), 5)

0 commit comments

Comments
 (0)