From daff55dc79fba8567cf658bf80c241f6596b9ab5 Mon Sep 17 00:00:00 2001 From: Corey Sobel Date: Tue, 18 Jan 2022 22:30:03 +0000 Subject: [PATCH 1/2] caching: fix cached_per_instance https://github.com/quora/qcore/issues/83 --- qcore/caching.py | 3 +++ qcore/tests/test_caching.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/qcore/caching.py b/qcore/caching.py index ec9cf9d..51be2bf 100644 --- a/qcore/caching.py +++ b/qcore/caching.py @@ -331,6 +331,9 @@ def get_args_tuple(args, kwargs, arg_names, kwargs_defaults): else: args_list.append(kwargs[arg_name]) args_len += 1 + remaining_keys = sorted([k for k in kwargs if k not in arg_names]) + for k in remaining_keys: + args_list.append((k, kwargs[k])) except KeyError as e: raise TypeError("Missing argument %r" % (e.args[0],)) return tuple(args_list) diff --git a/qcore/tests/test_caching.py b/qcore/tests/test_caching.py index eaada00..c62ea4c 100644 --- a/qcore/tests/test_caching.py +++ b/qcore/tests/test_caching.py @@ -363,6 +363,11 @@ def with_kwargs(self, x=1, y=2, z=3): self.x += x + y + z return self.x + @cached_per_instance() + def with_variable_kwargs(self, **kwargs): + self.x += sum(kwargs.values()) + return self.x + def test_cached_per_instance(): get_x_cache = TestClass.get_x.__cached_per_instance_cache__ @@ -413,6 +418,16 @@ def test_cached_per_instance(): assert_eq(0, len(get_x_cache), extra=repr(get_x_cache)) assert_eq(0, len(with_kwargs_cache), extra=repr(with_kwargs_cache)) + object3 = TestClass(0) + assert_eq(0, object3.x) + object3.with_variable_kwargs(k1=2) + assert_eq(2, object3.x) + object3.with_variable_kwargs(k1=2) + assert_eq(2, object3.x) + object3.with_variable_kwargs(k2=2) + assert_eq(4, object3.x) + object3.with_variable_kwargs(k1=2, k2=2) + assert_eq(8, object3.x) class PickleTestClass(object): @cached_per_instance() From f8bae6b7d7acd3507f26610718593fe906ab70a4 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Tue, 18 Jan 2022 14:39:46 -0800 Subject: [PATCH 2/2] Update qcore/tests/test_caching.py --- qcore/tests/test_caching.py | 1 + 1 file changed, 1 insertion(+) diff --git a/qcore/tests/test_caching.py b/qcore/tests/test_caching.py index c62ea4c..2059695 100644 --- a/qcore/tests/test_caching.py +++ b/qcore/tests/test_caching.py @@ -429,6 +429,7 @@ def test_cached_per_instance(): object3.with_variable_kwargs(k1=2, k2=2) assert_eq(8, object3.x) + class PickleTestClass(object): @cached_per_instance() def f(self, x):