Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 0f56e90

Browse files
committed
Support cache sizes.
1 parent a893927 commit 0f56e90

2 files changed

Lines changed: 49 additions & 1 deletion

File tree

Lib/functools.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ def wrapper(*args, **kwds):
144144
wrapper.misses += 1
145145
if len(cache) > maxsize:
146146
# purge the 10% least frequently used entries
147-
for key, _ in nsmallest(maxsize // 10,
147+
for key, _ in nsmallest(maxsize // 10 or 1,
148148
use_count.items(),
149149
key=itemgetter(1)):
150150
del cache[key], use_count[key]

Lib/test/test_functools.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,30 @@ def orig(x, y):
482482
self.assertEqual(f.hits, 0)
483483
self.assertEqual(f.misses, 1)
484484

485+
# test size zero (which means "never-cache")
486+
f_cnt = 0
487+
@functools.lru_cache(0)
488+
def f():
489+
nonlocal f_cnt
490+
f_cnt += 1
491+
return 20
492+
self.assertEqual(f(), 20)
493+
self.assertEqual(f(), 20)
494+
self.assertEqual(f(), 20)
495+
self.assertEqual(f_cnt, 3)
496+
497+
# test size one
498+
f_cnt = 0
499+
@functools.lru_cache(1)
500+
def f():
501+
nonlocal f_cnt
502+
f_cnt += 1
503+
return 20
504+
self.assertEqual(f(), 20)
505+
self.assertEqual(f(), 20)
506+
self.assertEqual(f(), 20)
507+
self.assertEqual(f_cnt, 1)
508+
485509
def test_lfu(self):
486510
def orig(x, y):
487511
return 3*x+y
@@ -503,6 +527,30 @@ def orig(x, y):
503527
self.assertEqual(f.hits, 0)
504528
self.assertEqual(f.misses, 1)
505529

530+
# test size zero (which means "never-cache")
531+
f_cnt = 0
532+
@functools.lfu_cache(0)
533+
def f():
534+
nonlocal f_cnt
535+
f_cnt += 1
536+
return 20
537+
self.assertEqual(f(), 20)
538+
self.assertEqual(f(), 20)
539+
self.assertEqual(f(), 20)
540+
self.assertEqual(f_cnt, 3)
541+
542+
# test size one
543+
f_cnt = 0
544+
@functools.lfu_cache(1)
545+
def f():
546+
nonlocal f_cnt
547+
f_cnt += 1
548+
return 20
549+
self.assertEqual(f(), 20)
550+
self.assertEqual(f(), 20)
551+
self.assertEqual(f(), 20)
552+
self.assertEqual(f_cnt, 1)
553+
506554
def test_main(verbose=None):
507555
test_classes = (
508556
TestPartial,

0 commit comments

Comments
 (0)