summaryrefslogtreecommitdiff
path: root/searx/utils.py
diff options
context:
space:
mode:
authorMarkus Heiser <markus.heiser@darmarit.de>2021-05-27 20:15:33 +0200
committerMarkus Heiser <markus.heiser@darmarit.de>2021-05-28 08:32:52 +0200
commit96b223023acc1a1b0642a70246b71c2a3a05cd03 (patch)
treedfe838ed1ebed619953647fddaba044cf209e58e /searx/utils.py
parent6ed4616da99b25703489e7431d84d8749a7a167c (diff)
downloadsearxng-96b223023acc1a1b0642a70246b71c2a3a05cd03.tar.gz
searxng-96b223023acc1a1b0642a70246b71c2a3a05cd03.zip
[mod] utils.get_value() - avoidance of a recursion
In a comment [1] dalf suggested to avoid a recursion of get_value() [1] https://github.com/searxng/searxng/pull/99#discussion_r640833716 Suggested-by: Alexandre Flament <alex@al-f.net> Signed-off-by: Markus Heiser <markus.heiser@darmarit.de>
Diffstat (limited to 'searx/utils.py')
-rw-r--r--searx/utils.py28
1 files changed, 12 insertions, 16 deletions
diff --git a/searx/utils.py b/searx/utils.py
index 8c5b3a9b3..ad69816ce 100644
--- a/searx/utils.py
+++ b/searx/utils.py
@@ -505,13 +505,14 @@ NOT_EXISTS = object()
"""Singleton used by :py:obj:`get_value` if a key does not exists."""
-def get_value(dictionary, keyword, *keys, default=NOT_EXISTS):
+def get_value(dictionary, *keys, default=NOT_EXISTS):
"""Return the value from a *deep* mapping type (e.g. the ``settings`` object
from yaml). If the path to the *key* does not exists a :py:obj:`NOT_EXISTS`
is returned (non ``KeyError`` exception is raised).
.. code: python
+ >>> from searx import settings
>>> from searx.utils import get_value, NOT_EXISTS
>>> get_value(settings, 'checker', 'additional_tests', 'rosebud', 'result_container')
['not_empty', ['one_title_contains', 'citizen kane']]
@@ -519,7 +520,7 @@ def get_value(dictionary, keyword, *keys, default=NOT_EXISTS):
>>> get_value(settings, 'search', 'xxx') is NOT_EXISTS
True
>>> get_value(settings, 'search', 'formats')
- ['csv', 'json', 'rss']
+ ['html', 'csv', 'json', 'rss']
The list returned from the ``search.format`` key is not a mapping type, you
can't traverse along non-mapping types. If you try it, you will get a
@@ -529,7 +530,7 @@ def get_value(dictionary, keyword, *keys, default=NOT_EXISTS):
>>> get_value(settings, 'search', 'format', 'csv') is NOT_EXISTS
True
- >>> get_value(settings, 'search', 'formats')[0]
+ >>> get_value(settings, 'search', 'formats')[1]
'csv'
For convenience you can replace :py:ref:`NOT_EXISTS` by a default value of
@@ -541,20 +542,15 @@ def get_value(dictionary, keyword, *keys, default=NOT_EXISTS):
print("csv format is denied")
"""
- if not isinstance(dictionary, Mapping):
- raise TypeError("expected mapping type, got %s" % type(dictionary))
- ret_val = dictionary.get(keyword, default)
-
- if ret_val is default:
- return ret_val
-
- if len(keys):
- if not isinstance(ret_val, Mapping):
- ret_val = default
- else:
- ret_val = get_value(ret_val, *keys, default=default)
- return ret_val
+ obj = dictionary
+ for k in keys:
+ if not isinstance(obj, Mapping):
+ raise TypeError("expected mapping type, got %s" % type(obj))
+ obj = obj.get(k, default)
+ if obj is default:
+ return obj
+ return obj
def get_xpath(xpath_spec):