summaryrefslogtreecommitdiffstats
path: root/Lib/configparser.py
diff options
context:
space:
mode:
authorŁukasz Langa <lukasz@langa.pl>2010-12-17 01:32:29 (GMT)
committerŁukasz Langa <lukasz@langa.pl>2010-12-17 01:32:29 (GMT)
commitb25a791802a1915097e02bfba04e27a41ae55ebf (patch)
tree67ed431421efd15f08d7b945d752549c7227f8f9 /Lib/configparser.py
parented16bf4aaadd3deaedac8ee36753857b6b8a3492 (diff)
downloadcpython-b25a791802a1915097e02bfba04e27a41ae55ebf.zip
cpython-b25a791802a1915097e02bfba04e27a41ae55ebf.tar.gz
cpython-b25a791802a1915097e02bfba04e27a41ae55ebf.tar.bz2
configparser API cleanup: default values now sensible, slightly incompatible.
Backwards compatible alternative values possible as documented. Done by Łukasz Langa, approved by Raymond and Fred.
Diffstat (limited to 'Lib/configparser.py')
-rw-r--r--Lib/configparser.py42
1 files changed, 19 insertions, 23 deletions
diff --git a/Lib/configparser.py b/Lib/configparser.py
index aba444c..0e41d2f 100644
--- a/Lib/configparser.py
+++ b/Lib/configparser.py
@@ -15,8 +15,9 @@ ConfigParser -- responsible for parsing a list of
methods:
__init__(defaults=None, dict_type=_default_dict, allow_no_value=False,
- delimiters=('=', ':'), comment_prefixes=_COMPATIBLE,
- strict=False, empty_lines_in_values=True):
+ delimiters=('=', ':'), comment_prefixes=('#', ';'),
+ inline_comment_prefixes=None, strict=True,
+ empty_lines_in_values=True):
Create the parser. When `defaults' is given, it is initialized into the
dictionary or intrinsic defaults. The keys must be strings, the values
must be appropriate for %()s string interpolation.
@@ -29,11 +30,15 @@ ConfigParser -- responsible for parsing a list of
that divide keys from values.
When `comment_prefixes' is given, it will be used as the set of
- substrings that prefix comments in a line.
+ substrings that prefix comments in empty lines. Comments can be
+ indented.
+
+ When `inline_comment_prefixes' is given, it will be used as the set of
+ substrings that prefix comments in non-empty lines.
When `strict` is True, the parser won't allow for any section or option
duplicates while reading from a single source (file, string or
- dictionary). Default is False.
+ dictionary). Default is True.
When `empty_lines_in_values' is False (default: True), each empty line
marks the end of an option. Otherwise, internal empty lines of
@@ -340,11 +345,6 @@ class MissingSectionHeaderError(ParsingError):
self.args = (filename, lineno, line)
-# Used in parsers to denote selecting a backwards-compatible inline comment
-# character behavior (; and # are comments at the start of a line, but ; only
-# inline)
-_COMPATIBLE = object()
-
# Used in parser getters to indicate the default behaviour when a specific
# option is not found it to raise an exception. Created to enable `None' as
# a valid fallback value.
@@ -592,8 +592,8 @@ class RawConfigParser(MutableMapping):
def __init__(self, defaults=None, dict_type=_default_dict,
allow_no_value=False, *, delimiters=('=', ':'),
- comment_prefixes=_COMPATIBLE, strict=False,
- empty_lines_in_values=True,
+ comment_prefixes=('#', ';'), inline_comment_prefixes=None,
+ strict=True, empty_lines_in_values=True,
default_section=DEFAULTSECT,
interpolation=_UNSET):
@@ -616,12 +616,8 @@ class RawConfigParser(MutableMapping):
else:
self._optcre = re.compile(self._OPT_TMPL.format(delim=d),
re.VERBOSE)
- if comment_prefixes is _COMPATIBLE:
- self._startonly_comment_prefixes = ('#',)
- self._comment_prefixes = (';',)
- else:
- self._startonly_comment_prefixes = ()
- self._comment_prefixes = tuple(comment_prefixes or ())
+ self._comment_prefixes = tuple(comment_prefixes or ())
+ self._inline_comment_prefixes = tuple(inline_comment_prefixes or ())
self._strict = strict
self._allow_no_value = allow_no_value
self._empty_lines_in_values = empty_lines_in_values
@@ -989,18 +985,18 @@ class RawConfigParser(MutableMapping):
indent_level = 0
e = None # None, or an exception
for lineno, line in enumerate(fp, start=1):
- # strip full line comments
comment_start = None
- for prefix in self._startonly_comment_prefixes:
- if line.strip().startswith(prefix):
- comment_start = 0
- break
# strip inline comments
- for prefix in self._comment_prefixes:
+ for prefix in self._inline_comment_prefixes:
index = line.find(prefix)
if index == 0 or (index > 0 and line[index-1].isspace()):
comment_start = index
break
+ # strip full line comments
+ for prefix in self._comment_prefixes:
+ if line.strip().startswith(prefix):
+ comment_start = 0
+ break
value = line[:comment_start].strip()
if not value:
if self._empty_lines_in_values: