From 0a1fa0e8b1fc888ae9978003c836e5a1953daef5 Mon Sep 17 00:00:00 2001 From: Fred Drake Date: Tue, 10 Aug 2010 13:09:54 +0000 Subject: [PATCH] Issue #9551: Do not raise TypeError when setting the value to None for SafeConfigParser instances constructed with allow_no_value == True. --- Lib/ConfigParser.py | 18 +++++++++--------- Lib/test/test_cfgparser.py | 3 +++ Misc/NEWS | 3 +++ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/Lib/ConfigParser.py b/Lib/ConfigParser.py index 3e2175f0495..d356a138a13 100644 --- a/Lib/ConfigParser.py +++ b/Lib/ConfigParser.py @@ -699,13 +699,13 @@ class SafeConfigParser(ConfigParser): if self._optcre is self.OPTCRE or value: if not isinstance(value, basestring): raise TypeError("option values must be strings") - # check for bad percent signs: - # first, replace all "good" interpolations - tmp_value = value.replace('%%', '') - tmp_value = self._interpvar_re.sub('', tmp_value) - # then, check if there's a lone percent sign left - percent_index = tmp_value.find('%') - if percent_index != -1: - raise ValueError("invalid interpolation syntax in %r at " - "position %d" % (value, percent_index)) + if value is not None: + # check for bad percent signs: + # first, replace all "good" interpolations + tmp_value = value.replace('%%', '') + tmp_value = self._interpvar_re.sub('', tmp_value) + # then, check if there's a lone percent sign left + if '%' in tmp_value: + raise ValueError("invalid interpolation syntax in %r at " + "position %d" % (value, tmp_value.find('%'))) ConfigParser.set(self, section, option, value) diff --git a/Lib/test/test_cfgparser.py b/Lib/test/test_cfgparser.py index 22a314d779b..5417d247fd4 100644 --- a/Lib/test/test_cfgparser.py +++ b/Lib/test/test_cfgparser.py @@ -357,6 +357,7 @@ class TestCaseBase(unittest.TestCase): class ConfigParserTestCase(TestCaseBase): config_class = ConfigParser.ConfigParser + allow_no_value = True def test_interpolation(self): rawval = { @@ -397,6 +398,7 @@ class ConfigParserTestCase(TestCaseBase): cf.set('non-string', 'dict', {'pi': 3.14159, '%(': 1, '%(list)': '%(list)'}) cf.set('non-string', 'string_with_interpolation', '%(list)s') + cf.set('non-string', 'no-value') self.assertEqual(cf.get('non-string', 'int', raw=True), 1) self.assertRaises(TypeError, cf.get, 'non-string', 'int') self.assertEqual(cf.get('non-string', 'list', raw=True), @@ -409,6 +411,7 @@ class ConfigParserTestCase(TestCaseBase): raw=True), '%(list)s') self.assertRaises(ValueError, cf.get, 'non-string', 'string_with_interpolation', raw=False) + self.assertEqual(cf.get('non-string', 'no-value'), None) class MultilineValuesTestCase(TestCaseBase): config_class = ConfigParser.ConfigParser diff --git a/Misc/NEWS b/Misc/NEWS index 6bf21ac2021..b4909faa350 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -29,6 +29,9 @@ Core and Builtins Library ------- +- Issue #9551: Don't raise TypeError when setting the value to None for + SafeConfigParser instances constructed with allow_no_value == True. + - Issue #6915: Under Windows, os.listdir() didn't release the Global Interpreter Lock around all system calls. Original patch by Ryan Kelly.