From 9f005b54e48c87f69f218491e028f8f951e2d24d Mon Sep 17 00:00:00 2001 From: Gabriel Ferreira Date: Thu, 8 Apr 2021 07:49:20 +0200 Subject: [PATCH] Use memoization for config variables --- picard/config.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/picard/config.py b/picard/config.py index 62a90869c..08d25de71 100644 --- a/picard/config.py +++ b/picard/config.py @@ -59,6 +59,7 @@ class ConfigSection(QtCore.QObject): self.__name = name self.__prefix = self.__name + '/' self.__prefix_len = len(self.__prefix) + self._memoization = {} def key(self, name): return self.__prefix + name @@ -77,6 +78,8 @@ class ConfigSection(QtCore.QObject): def __setitem__(self, name, value): key = self.key(name) self.__qt_config.setValue(key, value) + if key in self._memoization: + self._memoization[key][0] = False def __contains__(self, name): return self.__qt_config.contains(self.key(name)) @@ -86,6 +89,8 @@ class ConfigSection(QtCore.QObject): config = self.__qt_config if config.contains(key): config.remove(key) + if key in self._memoization: + del self._memoization[key] def raw_value(self, name, qtype=None): """Return an option value without any type conversion.""" @@ -99,12 +104,20 @@ class ConfigSection(QtCore.QObject): def value(self, name, option_type, default=None): """Return an option value converted to the given Option type.""" if name in self: + key = self.key(name) try: - value = self.raw_value(name, qtype=option_type.qtype) - value = option_type.convert(value) - except Exception as why: - log.error('Cannot read %s value: %s', self.key(name), why, exc_info=True) - value = default + valid, value = self._memoization[key] + except KeyError: + valid = False + + if not valid: + try: + value = self.raw_value(name, qtype=option_type.qtype) + value = option_type.convert(value) + self._memoization[key] = [True, value] + except Exception as why: + log.error('Cannot read %s value: %s', self.key(name), why, exc_info=True) + value = default return value return default