Commit ac7c5acf authored by Raymond Hettinger's avatar Raymond Hettinger

merge

parents ce16c682 4ee39141
...@@ -421,7 +421,7 @@ class _HashedSeq(list): ...@@ -421,7 +421,7 @@ class _HashedSeq(list):
def _make_key(args, kwds, typed, def _make_key(args, kwds, typed,
kwd_mark = (object(),), kwd_mark = (object(),),
fasttypes = {int, str, frozenset, type(None)}, 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 """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 The key is constructed in a way that is flat as possible rather than
...@@ -434,14 +434,13 @@ def _make_key(args, kwds, typed, ...@@ -434,14 +434,13 @@ def _make_key(args, kwds, typed,
""" """
key = args key = args
if kwds: if kwds:
sorted_items = sorted(kwds.items())
key += kwd_mark key += kwd_mark
for item in sorted_items: for item in kwds.items():
key += item key += item
if typed: if typed:
key += tuple(type(v) for v in args) key += tuple(type(v) for v in args)
if kwds: 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: elif len(key) == 1 and type(key[0]) in fasttypes:
return key[0] return key[0]
return _HashedSeq(key) return _HashedSeq(key)
......
...@@ -1342,6 +1342,16 @@ class TestLRU: ...@@ -1342,6 +1342,16 @@ class TestLRU:
self.assertEqual(fib.cache_info(), self.assertEqual(fib.cache_info(),
self.module._CacheInfo(hits=0, misses=0, maxsize=None, currsize=0)) 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 test_lru_cache_decoration(self):
def f(zomg: 'zomg_annotation'): def f(zomg: 'zomg_annotation'):
"""f doc string""" """f doc string"""
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment