diff --git a/memoization/caching/general/keys.py b/memoization/caching/general/keys.py index 0179580..1611957 100644 --- a/memoization/caching/general/keys.py +++ b/memoization/caching/general/keys.py @@ -8,8 +8,8 @@ def make_key(args, kwargs, kwargs_mark=(object(), )): key = args if kwargs: key += kwargs_mark - for item in kwargs.items(): - key += item + for kwarg_key in sorted(kwargs.keys()): + key += (kwarg_key, kwargs[kwarg_key]) try: hash_value = hash(key) except TypeError: # process unhashable types diff --git a/test.py b/test.py index de69d20..3ecd2b7 100644 --- a/test.py +++ b/test.py @@ -14,7 +14,7 @@ lock = Lock() # for multi-threading tests random.seed(100) # set seed to ensure that test results are reproducible -for i in range(1, 16): +for i in range(1, 17): exec_times['f' + str(i)] = 0 # init to zero @@ -115,6 +115,12 @@ def f15(x): return x +@cached() +def f16(*args, **kwargs): + exec_times['f16'] += 1 + return list(args) + [(key, value) for (key, value) in kwargs.items()] + + ################################################################################ # Test entry point ################################################################################ @@ -255,6 +261,39 @@ def test_memoization_statistic_only(self): self.assertEqual(info.misses, 0) self.assertEqual(info.current_size, 0) + def test_memoization_for_diffrent_order_of_kwargs(self): + f16( + 1, + 2, + kwarg1={"some": "dict"}, + kwarg2=["it's", "a", "list"], + kwarg3="just_string", + kwarg4=4, + ) + f16( + 1, + 2, + kwarg2=["it's", "a", "list"], + kwarg1={"some": "dict"}, + kwarg4=4, + kwarg3="just_string", + ) + f16( + 1, + 2, + kwarg3="just_string", + kwarg1={"some": "dict"}, + kwarg4=4, + kwarg2=["it's", "a", "list"], + ) + + self.assertEqual(exec_times['f16'], 1) + + info = f16.cache_info() + self.assertEqual(info.hits, 2) + self.assertEqual(info.misses, 1) + self.assertEqual(info.current_size, 1) + def _general_test(self, tested_function, algorithm, hits, misses, in_cache, not_in_cache): # clear exec_times[tested_function.__name__] = 0