]> granicus.if.org Git - python/commitdiff
Issue 22184: Early detection and reporting of missing lru_cache parameters
authorRaymond Hettinger <python@rcn.com>
Tue, 12 Aug 2014 19:44:52 +0000 (12:44 -0700)
committerRaymond Hettinger <python@rcn.com>
Tue, 12 Aug 2014 19:44:52 +0000 (12:44 -0700)
Lib/functools.py
Lib/test/test_functools.py
Misc/NEWS

index b8463ad2452cbf726d7a30df221542fe56b34104..24fdb166ab1ac531ceb837ede9f274d9f273e8dc 100644 (file)
@@ -392,6 +392,12 @@ def lru_cache(maxsize=128, typed=False):
     # The internals of the lru_cache are encapsulated for thread safety and
     # to allow the implementation to change (including a possible C version).
 
+    # Early detection of an erroneous call to @lru_cache without any arguments
+    # resulting in the inner function being passed to maxsize instead of an
+    # integer or None.
+    if maxsize is not None and not isinstance(maxsize, int):
+        raise TypeError('Expected maxsize to be an integer or None')
+
     # Constants shared by all lru cache instances:
     sentinel = object()          # unique object used to signal cache misses
     make_key = _make_key         # build a key from the function arguments
index 75ae7f3a15d5b2d0021be3b75d8ccb1be13f9450..a7e5c7e3ef4f51d50481a6aca36cd0ac6fe1430f 100644 (file)
@@ -1070,6 +1070,13 @@ class TestLRU(unittest.TestCase):
         self.assertEqual(test_func(DoubleEq(2)),    # Trigger a re-entrant __eq__ call
                          DoubleEq(2))               # Verify the correct return value
 
+    def test_early_detection_of_bad_call(self):
+        # Issue #22184
+        with self.assertRaises(TypeError):
+            @functools.lru_cache
+            def f():
+                pass
+
 
 class TestSingleDispatch(unittest.TestCase):
     def test_simple_overloads(self):
index 1c87874afc19dc38cf2008082937e5e7c54af416..310a3b0b36e7192b64940316273583d857195461 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -30,6 +30,9 @@ Library
 - Issue #21448: Changed FeedParser feed() to avoid O(N**2) behavior when
   parsing long line.  Original patch by Raymond Hettinger.
 
+- Issue #22184:  The functools LRU Cache decorator factory now gives an earlier
+  and clearer error message when the user forgets the required parameters.
+
 - Issue #17923: glob() patterns ending with a slash no longer match non-dirs on
   AIX.  Based on patch by Delhallt.