summaryrefslogtreecommitdiffstats
path: root/Lib/configparser.py
diff options
context:
space:
mode:
authorŁukasz Langa <lukasz@langa.pl>2010-12-04 12:46:01 (GMT)
committerŁukasz Langa <lukasz@langa.pl>2010-12-04 12:46:01 (GMT)
commit2cf9ddb390564046242d7b0c5667c62843e74714 (patch)
treeda6760e3fc78c4c8ffd0ca914c173359e8793c5d /Lib/configparser.py
parentd2a9b20efaa15b0152856a545b0206af21d06c5e (diff)
downloadcpython-2cf9ddb390564046242d7b0c5667c62843e74714.zip
cpython-2cf9ddb390564046242d7b0c5667c62843e74714.tar.gz
cpython-2cf9ddb390564046242d7b0c5667c62843e74714.tar.bz2
configparser: fixed inconsistency where in SafeConfigParser option values
were ensured to be strings but section names and option keys were not. Behaviour unchanged for RawConfigParser and ConfigParser.
Diffstat (limited to 'Lib/configparser.py')
-rw-r--r--Lib/configparser.py23
1 files changed, 19 insertions, 4 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py
index eafcea3..e92d7fa 100644
--- a/Lib/configparser.py
+++ b/Lib/configparser.py
@@ -727,11 +727,15 @@ class RawConfigParser(MutableMapping):
that should be present in the section. If the used dictionary type
preserves order, sections and their keys will be added in order.
+ All types held in the dictionary are converted to strings during
+ reading, including section names, option names and keys.
+
Optional second argument is the `source' specifying the name of the
dictionary being read.
"""
elements_added = set()
for section, keys in dictionary.items():
+ section = str(section)
try:
self.add_section(section)
except (DuplicateSectionError, ValueError):
@@ -739,7 +743,7 @@ class RawConfigParser(MutableMapping):
raise
elements_added.add(section)
for key, value in keys.items():
- key = self.optionxform(key)
+ key = self.optionxform(str(key))
if value is not None:
value = str(value)
if self._strict and (section, key) in elements_added:
@@ -1128,7 +1132,7 @@ class RawConfigParser(MutableMapping):
raise ValueError('Not a boolean: %s' % value)
return self.BOOLEAN_STATES[value.lower()]
- def _validate_value_type(self, value):
+ def _validate_value_types(self, *, section="", option="", value=""):
"""Raises a TypeError for non-string values.
The only legal non-string value if we allow valueless
@@ -1141,6 +1145,10 @@ class RawConfigParser(MutableMapping):
for RawConfigParsers and ConfigParsers. It is invoked in every
case for mapping protocol access and in SafeConfigParser.set().
"""
+ if not isinstance(section, str):
+ raise TypeError("section names must be strings")
+ if not isinstance(option, str):
+ raise TypeError("option keys must be strings")
if not self._allow_no_value or value:
if not isinstance(value, str):
raise TypeError("option values must be strings")
@@ -1169,9 +1177,16 @@ class SafeConfigParser(ConfigParser):
def set(self, section, option, value=None):
"""Set an option. Extends RawConfigParser.set by validating type and
interpolation syntax on the value."""
- self._validate_value_type(value)
+ self._validate_value_types(option=option, value=value)
super().set(section, option, value)
+ def add_section(self, section):
+ """Create a new section in the configuration. Extends
+ RawConfigParser.add_section by validating if the section name is
+ a string."""
+ self._validate_value_types(section=section)
+ super().add_section(section)
+
class SectionProxy(MutableMapping):
"""A proxy for a single section from a parser."""
@@ -1196,7 +1211,7 @@ class SectionProxy(MutableMapping):
return self._parser.get(self._name, key)
def __setitem__(self, key, value):
- self._parser._validate_value_type(value)
+ self._parser._validate_value_types(option=key, value=value)
return self._parser.set(self._name, key, value)
def __delitem__(self, key):