diff options
author | Ludwig Hähne <lhaehne@gmail.com> | 2021-10-15 15:28:10 +0200 |
---|---|---|
committer | Jon Parise <jon@pinterest.com> | 2022-02-20 12:08:42 -0800 |
commit | 828394ffabfdeadbae96cc167d3953e71a050a2a (patch) | |
tree | 1867a8d6e5d27bb25ce9fd786d3eb4ef8820e51c /pymemcache | |
parent | 4cdf69d4d493dd7f806ee10e25f164b9c0d6c63b (diff) | |
download | pymemcache-828394ffabfdeadbae96cc167d3953e71a050a2a.tar.gz |
Return default from hash client when using positional argument (#354)
When using HashClient with ignore_exc, get would always return
None if no server is available and the default is passed as a
positional argument. The other clients return the default
value in this case. An earlier fix only had the desired effect when
passing default as a keyword argument.
For example, Django passes the default as a positional argument.
Return the default value so HashClient behaves like the other
clients.
Diffstat (limited to 'pymemcache')
-rw-r--r-- | pymemcache/client/hash.py | 5 | ||||
-rw-r--r-- | pymemcache/test/test_client_hash.py | 17 |
2 files changed, 17 insertions, 5 deletions
diff --git a/pymemcache/client/hash.py b/pymemcache/client/hash.py index 789f111..72cb9d8 100644 --- a/pymemcache/client/hash.py +++ b/pymemcache/client/hash.py @@ -357,9 +357,8 @@ class HashClient(object): def set(self, key, *args, **kwargs): return self._run_cmd('set', key, False, *args, **kwargs) - def get(self, key, *args, **kwargs): - default = kwargs.get('default', None) - return self._run_cmd('get', key, default, *args, **kwargs) + def get(self, key, default=None, **kwargs): + return self._run_cmd('get', key, default, default=default, **kwargs) def incr(self, key, *args, **kwargs): return self._run_cmd('incr', key, False, *args, **kwargs) diff --git a/pymemcache/test/test_client_hash.py b/pymemcache/test/test_client_hash.py index 514b019..aecc1bd 100644 --- a/pymemcache/test/test_client_hash.py +++ b/pymemcache/test/test_client_hash.py @@ -262,6 +262,19 @@ class TestHashClient(ClientTestMixin, unittest.TestCase): result = client.set('foo', 'bar') assert result is False + def test_no_servers_left_return_positional_default(self): + from pymemcache.client.hash import HashClient + client = HashClient( + [], use_pooling=True, + ignore_exc=True, + timeout=1, connect_timeout=1 + ) + + # Ensure compatibility with clients that pass the default as a + # positional argument + result = client.get('foo', 'default') + assert result == 'default' + def test_no_servers_left_with_set_many(self): from pymemcache.client.hash import HashClient client = HashClient( @@ -381,7 +394,7 @@ class TestHashClient(ClientTestMixin, unittest.TestCase): # Client gets removed because of socket timeout assert ("127.0.0.1", 11211) in client._dead_clients - test_client.get.side_effect = lambda *_: "Some value" + test_client.get.side_effect = lambda *_, **_kw: "Some value" # Client should be retried and brought back assert client.get(b"key") == "Some value" assert ("127.0.0.1", 11211) not in client._dead_clients @@ -400,7 +413,7 @@ class TestHashClient(ClientTestMixin, unittest.TestCase): with pytest.raises(socket.timeout): client.get(b"key", noreply=False) - test_client.get.side_effect = lambda *_: "Some value" + test_client.get.side_effect = lambda *_, **_kw: "Some value" assert client.get(b"key") == "Some value" assert client_patch.call_count == 1 |