bpo-38565: add new cache_parameters method for lru_cache (GH-16916)

diff --git a/Lib/functools.py b/Lib/functools.py
index 3192bd0..2c01b2e 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -499,6 +499,7 @@
         # The user_function was passed in directly via the maxsize argument
         user_function, maxsize = maxsize, 128
         wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
+        wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed}
         return update_wrapper(wrapper, user_function)
     elif maxsize is not None:
         raise TypeError(
@@ -506,6 +507,7 @@
 
     def decorating_function(user_function):
         wrapper = _lru_cache_wrapper(user_function, maxsize, typed, _CacheInfo)
+        wrapper.cache_parameters = lambda : {'maxsize': maxsize, 'typed': typed}
         return update_wrapper(wrapper, user_function)
 
     return decorating_function
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index c300270..a97ca39 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -1655,6 +1655,17 @@
                 f_copy = copy.deepcopy(f)
                 self.assertIs(f_copy, f)
 
+    def test_lru_cache_parameters(self):
+        @self.module.lru_cache(maxsize=2)
+        def f():
+            return 1
+        self.assertEqual(f.cache_parameters(), {'maxsize': 2, "typed": False})
+
+        @self.module.lru_cache(maxsize=1000, typed=True)
+        def f():
+            return 1
+        self.assertEqual(f.cache_parameters(), {'maxsize': 1000, "typed": True})
+
 
 @py_functools.lru_cache()
 def py_cached_func(x, y):