[Python-checkins] cpython (3.4): Issue #21159: Improve message in configparser.InterpolationMissingOptionError.

robert.collins python-checkins at python.org
Fri Aug 14 01:50:35 CEST 2015


https://hg.python.org/cpython/rev/267422f7c927
changeset: 97373:267422f7c927
branch: 3.4
parent: 97369:c515b40a70eb
user: Robert Collins <rbtcollins at hp.com>
date: Fri Aug 14 11:11:35 2015 +1200
summary:
 Issue #21159: Improve message in configparser.InterpolationMissingOptionError.
Patch from Łukasz Langa.
files:
 Lib/configparser.py | 29 +++++++++++-----------
 Lib/test/test_configparser.py | 7 +++--
 Misc/NEWS | 3 ++
 3 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/Lib/configparser.py b/Lib/configparser.py
--- a/Lib/configparser.py
+++ b/Lib/configparser.py
@@ -241,12 +241,9 @@
 """A string substitution required a setting which was not available."""
 
 def __init__(self, option, section, rawval, reference):
- msg = ("Bad value substitution:\n"
- "\tsection: [%s]\n"
- "\toption : %s\n"
- "\tkey : %s\n"
- "\trawval : %s\n"
- % (section, option, reference, rawval))
+ msg = ("Bad value substitution: option {!r} in section {!r} contains "
+ "an interpolation key {!r} which is not a valid option name. "
+ "Raw value: {!r}".format(option, section, reference, rawval))
 InterpolationError.__init__(self, option, section, msg)
 self.reference = reference
 self.args = (option, section, rawval, reference)
@@ -264,11 +261,11 @@
 """Raised when substitutions are nested too deeply."""
 
 def __init__(self, option, section, rawval):
- msg = ("Value interpolation too deeply recursive:\n"
- "\tsection: [%s]\n"
- "\toption : %s\n"
- "\trawval : %s\n"
- % (section, option, rawval))
+ msg = ("Recursion limit exceeded in value substitution: option {!r} "
+ "in section {!r} contains an interpolation key which "
+ "cannot be substituted in {} steps. Raw value: {!r}"
+ "".format(option, section, MAX_INTERPOLATION_DEPTH,
+ rawval))
 InterpolationError.__init__(self, option, section, msg)
 self.args = (option, section, rawval)
 
@@ -384,8 +381,9 @@
 
 def _interpolate_some(self, parser, option, accum, rest, section, map,
 depth):
+ rawval = parser.get(section, option, raw=True, fallback=rest)
 if depth > MAX_INTERPOLATION_DEPTH:
- raise InterpolationDepthError(option, section, rest)
+ raise InterpolationDepthError(option, section, rawval)
 while rest:
 p = rest.find("%")
 if p < 0:
@@ -410,7 +408,7 @@
 v = map[var]
 except KeyError:
 raise InterpolationMissingOptionError(
- option, section, rest, var)
+ option, section, rawval, var)
 if "%" in v:
 self._interpolate_some(parser, option, accum, v,
 section, map, depth + 1)
@@ -444,8 +442,9 @@
 
 def _interpolate_some(self, parser, option, accum, rest, section, map,
 depth):
+ rawval = parser.get(section, option, raw=True, fallback=rest)
 if depth > MAX_INTERPOLATION_DEPTH:
- raise InterpolationDepthError(option, section, rest)
+ raise InterpolationDepthError(option, section, rawval)
 while rest:
 p = rest.find("$")
 if p < 0:
@@ -482,7 +481,7 @@
 "More than one ':' found: %r" % (rest,))
 except (KeyError, NoSectionError, NoOptionError):
 raise InterpolationMissingOptionError(
- option, section, rest, ":".join(path))
+ option, section, rawval, ":".join(path))
 if "$" in v:
 self._interpolate_some(parser, opt, accum, v, sect,
 dict(parser.items(sect, raw=True)),
diff --git a/Lib/test/test_configparser.py b/Lib/test/test_configparser.py
--- a/Lib/test/test_configparser.py
+++ b/Lib/test/test_configparser.py
@@ -847,7 +847,8 @@
 "something with lots of interpolation (10 steps)")
 e = self.get_error(cf, configparser.InterpolationDepthError, "Foo", "bar11")
 if self.interpolation == configparser._UNSET:
- self.assertEqual(e.args, ("bar11", "Foo", "%(with1)s"))
+ self.assertEqual(e.args, ("bar11", "Foo",
+ "something %(with11)s lots of interpolation (11 steps)"))
 elif isinstance(self.interpolation, configparser.LegacyInterpolation):
 self.assertEqual(e.args, ("bar11", "Foo",
 "something %(with11)s lots of interpolation (11 steps)"))
@@ -861,7 +862,7 @@
 self.assertEqual(e.option, "name")
 if self.interpolation == configparser._UNSET:
 self.assertEqual(e.args, ('name', 'Interpolation Error',
- '', 'reference'))
+ '%(reference)s', 'reference'))
 elif isinstance(self.interpolation, configparser.LegacyInterpolation):
 self.assertEqual(e.args, ('name', 'Interpolation Error',
 '%(reference)s', 'reference'))
@@ -1177,7 +1178,7 @@
 with self.assertRaises(exception_class) as cm:
 cf['interpolated']['$trying']
 self.assertEqual(cm.exception.reference, 'dollars:${sick')
- self.assertEqual(cm.exception.args[2], '}') #rawval
+ self.assertEqual(cm.exception.args[2], '${dollars:${sick}}') #rawval
 
 def test_case_sensitivity_basic(self):
 ini = textwrap.dedent("""
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -75,6 +75,9 @@
 Library
 -------
 
+- Issue #21159: Improve message in configparser.InterpolationMissingOptionError.
+ Patch from Łukasz Langa.
+
 - Issue #23888: Handle fractional time in cookie expiry. Patch by ssh.
 
 - Issue #23004: mock_open() now reads binary data correctly when the type of
-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /