summaryrefslogtreecommitdiff
path: root/Lib/configparser.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2011-02-21 19:38:53 +0000
committerRaymond Hettinger <python@rcn.com>2011-02-21 19:38:53 +0000
commit96b62cd99c8da9b4ee8bd3b696f79e6d5d14d545 (patch)
treec728fbd62f39cf10510a2efc9ed34f71d4f5be1c /Lib/configparser.py
parent51bfe20cb8b6e96a2425e1cb01a4e03f45c31748 (diff)
downloadcpython-96b62cd99c8da9b4ee8bd3b696f79e6d5d14d545.tar.gz
Issue #11089: Fix performance issue limiting the use of ConfigParser()
with large config files.
Diffstat (limited to 'Lib/configparser.py')
-rw-r--r--Lib/configparser.py17
1 files changed, 9 insertions, 8 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py
index f1866eb1c9..1bfdac899c 100644
--- a/Lib/configparser.py
+++ b/Lib/configparser.py
@@ -119,7 +119,7 @@ ConfigParser -- responsible for parsing a list of
between keys and values are surrounded by spaces.
"""
-from collections import MutableMapping, OrderedDict as _default_dict
+from collections import MutableMapping, OrderedDict as _default_dict, _ChainMap
import functools
import io
import itertools
@@ -1099,23 +1099,24 @@ class RawConfigParser(MutableMapping):
return exc
def _unify_values(self, section, vars):
- """Create a copy of the DEFAULTSECT with values from a specific
- `section' and the `vars' dictionary. If provided, values in `vars'
- take precendence.
+ """Create a sequence of lookups with 'vars' taking priority over
+ the 'section' which takes priority over the DEFAULTSECT.
+
"""
- d = self._defaults.copy()
+ sectiondict = {}
try:
- d.update(self._sections[section])
+ sectiondict = self._sections[section]
except KeyError:
if section != self.default_section:
raise NoSectionError(section)
# Update with the entry specific variables
+ vardict = {}
if vars:
for key, value in vars.items():
if value is not None:
value = str(value)
- d[self.optionxform(key)] = value
- return d
+ vardict[self.optionxform(key)] = value
+ return _ChainMap(vardict, sectiondict, self._defaults)
def _convert_to_boolean(self, value):
"""Return a boolean value translating from other types if necessary.