summaryrefslogtreecommitdiffstats
path: root/Lib/configparser.py
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2011-02-21 19:42:11 (GMT)
committerRaymond Hettinger <python@rcn.com>2011-02-21 19:42:11 (GMT)
commitddb52404eef6e107abbacd5d78c0f96a7e289b32 (patch)
treeeae4ce0650917c3d124e46d06e8c654b01cd1421 /Lib/configparser.py
parent31f5929c1e28adcaa1fdb302da366f3c7a92a98a (diff)
downloadcpython-ddb52404eef6e107abbacd5d78c0f96a7e289b32.zip
cpython-ddb52404eef6e107abbacd5d78c0f96a7e289b32.tar.gz
cpython-ddb52404eef6e107abbacd5d78c0f96a7e289b32.tar.bz2
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 f1866eb..1bfdac8 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.