summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2017-01-09 01:29:21 (GMT)
committerRaymond Hettinger <python@rcn.com>2017-01-09 01:29:21 (GMT)
commitac7c5acf9b1e474adfae5da6841e0d4cb343d7e8 (patch)
treeabebf8a6965be6ad10beda6b0076f5a4d4c62b93
parentce16c6827c3ce1253cf63518ef1da30a88f50623 (diff)
parent4ee39141e84c511e389080fa3163be043718ea14 (diff)
downloadcpython-ac7c5acf9b1e474adfae5da6841e0d4cb343d7e8.zip
cpython-ac7c5acf9b1e474adfae5da6841e0d4cb343d7e8.tar.gz
cpython-ac7c5acf9b1e474adfae5da6841e0d4cb343d7e8.tar.bz2
merge
-rw-r--r--Lib/functools.py7
-rw-r--r--Lib/test/test_functools.py10
2 files changed, 13 insertions, 4 deletions
diff --git a/Lib/functools.py b/Lib/functools.py
index b278bc2..89f2cf4 100644
--- a/Lib/functools.py
+++ b/Lib/functools.py
@@ -421,7 +421,7 @@ class _HashedSeq(list):
def _make_key(args, kwds, typed,
kwd_mark = (object(),),
fasttypes = {int, str, frozenset, type(None)},
- sorted=sorted, tuple=tuple, type=type, len=len):
+ tuple=tuple, type=type, len=len):
"""Make a cache key from optionally typed positional and keyword arguments
The key is constructed in a way that is flat as possible rather than
@@ -434,14 +434,13 @@ def _make_key(args, kwds, typed,
"""
key = args
if kwds:
- sorted_items = sorted(kwds.items())
key += kwd_mark
- for item in sorted_items:
+ for item in kwds.items():
key += item
if typed:
key += tuple(type(v) for v in args)
if kwds:
- key += tuple(type(v) for k, v in sorted_items)
+ key += tuple(type(v) for v in kwds.values())
elif len(key) == 1 and type(key[0]) in fasttypes:
return key[0]
return _HashedSeq(key)
diff --git a/Lib/test/test_functools.py b/Lib/test/test_functools.py
index ae0d9f7..9f4899e 100644
--- a/Lib/test/test_functools.py
+++ b/Lib/test/test_functools.py
@@ -1342,6 +1342,16 @@ class TestLRU:
self.assertEqual(fib.cache_info(),
self.module._CacheInfo(hits=0, misses=0, maxsize=None, currsize=0))
+ def test_kwargs_order(self):
+ # PEP 468: Preserving Keyword Argument Order
+ @self.module.lru_cache(maxsize=10)
+ def f(**kwargs):
+ return list(kwargs.items())
+ self.assertEqual(f(a=1, b=2), [('a', 1), ('b', 2)])
+ self.assertEqual(f(b=2, a=1), [('b', 2), ('a', 1)])
+ self.assertEqual(f.cache_info(),
+ self.module._CacheInfo(hits=0, misses=2, maxsize=10, currsize=2))
+
def test_lru_cache_decoration(self):
def f(zomg: 'zomg_annotation'):
"""f doc string"""