changeset 527:08924499db3c

Implement a simple interpolation cache for text types
author Franz Glasner <f.glasner@feldmann-mg.com>
date Mon, 20 Dec 2021 13:12:14 +0100
parents 48990863b905
children 54a8d020f5d5
files configmix/config.py
diffstat 1 files changed, 9 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/configmix/config.py	Mon Dec 20 12:45:48 2021 +0100
+++ b/configmix/config.py	Mon Dec 20 13:12:14 2021 +0100
@@ -335,11 +335,13 @@
         # PY2.7 compat: must be set before calling the superclass' __init__
         #
         self.__lookup_cache = {}
+        self.__interpolation_cache = {}
         super(Configuration, self).__init__(*args, **kwds)
 
     def clear_cache(self):
         """Clear the internal lookup cache"""
         self.__lookup_cache.clear()
+        self.__interpolation_cache.clear()
 
     def __getitem__(self, key):
         """Mapping and list interface that forwards to :meth:`~.getvarl_s`
@@ -775,6 +777,9 @@
         start = s.find(_STARTTOK, 0)
         if start < 0:
             return s
+        res = self.__interpolation_cache.get(s, _MARKER)
+        if res is not _MARKER:
+            return res
         len_s = len(s)
         res = []
         res_append = res.append
@@ -810,6 +815,7 @@
             # the whole `s` is just one expansion
             #
             if (start == 0) and (rest == len_s):
+                self.__interpolation_cache[s] = varvalue
                 return varvalue
             if varvalue is None:
                 pass
@@ -818,7 +824,9 @@
             # don't re-evaluate because `self.getvar_s()` expands already
             start = s.find(_STARTTOK, rest)
         res_append(s[rest:])
-        return _EMPTY_STR.join(res)
+        res = _EMPTY_STR.join(res)
+        self.__interpolation_cache[s] = res
+        return res
 
     def _apply_filters(self, filters, value):
         for name in filters: