summaryrefslogtreecommitdiffstats
path: root/Doc/library/configparser.rst
diff options
context:
space:
mode:
authorŁukasz Langa <lukasz@langa.pl>2010-11-10 18:57:39 (GMT)
committerŁukasz Langa <lukasz@langa.pl>2010-11-10 18:57:39 (GMT)
commit26d513cf2ff31ba7c4f8862d5d28cb4cfa71de67 (patch)
tree058c9a6c41ea34dfd04472c5328463e063bbdcd9 /Doc/library/configparser.rst
parent47f637ce17022464307b093cee6f367e2dc7f024 (diff)
downloadcpython-26d513cf2ff31ba7c4f8862d5d28cb4cfa71de67.zip
cpython-26d513cf2ff31ba7c4f8862d5d28cb4cfa71de67.tar.gz
cpython-26d513cf2ff31ba7c4f8862d5d28cb4cfa71de67.tar.bz2
Issue #5412: extend configparser to support mapping access
Diffstat (limited to 'Doc/library/configparser.rst')
-rw-r--r--Doc/library/configparser.rst1047
1 files changed, 759 insertions, 288 deletions
diff --git a/Doc/library/configparser.rst b/Doc/library/configparser.rst
index d80f94e..f661866 100644
--- a/Doc/library/configparser.rst
+++ b/Doc/library/configparser.rst
@@ -7,7 +7,9 @@
.. moduleauthor:: Ken Manheimer <klm@zope.com>
.. moduleauthor:: Barry Warsaw <bwarsaw@python.org>
.. moduleauthor:: Eric S. Raymond <esr@thyrsus.com>
+.. moduleauthor:: Łukasz Langa <lukasz@langa.pl>
.. sectionauthor:: Christopher G. Petrilli <petrilli@amber.org>
+.. sectionauthor:: Łukasz Langa <lukasz@langa.pl>
.. index::
pair: .ini; file
@@ -26,26 +28,219 @@ customized by end users easily.
This library does *not* interpret or write the value-type prefixes used in
the Windows Registry extended version of INI syntax.
+.. seealso::
+
+ Module :mod:`shlex`
+ Support for a creating Unix shell-like mini-languages which can be used
+ as an alternate format for application configuration files.
+
+Quick Start
+-----------
+
+.. highlightlang:: none
+
+Let's take a very basic configuration file that looks like this::
+
+ [DEFAULT]
+ ServerAliveInterval = 45
+ Compression = yes
+ CompressionLevel = 9
+ ForwardX11 = yes
+
+ [bitbucket.org]
+ User = hg
+
+ [topsecret.server.com]
+ Port = 50022
+ ForwardX11 = no
+
+The supported file structure of INI files is described `in the following section
+<#supported-ini-file-structure>`_, fow now all there's to know is that the file
+consists of sections, each of which contains keys with values.
+:mod:`configparser` classes can read and write such files. Let's start by
+creating the above configuration file programatically.
+
+.. highlightlang:: python
+.. doctest::
+
+ >>> import configparser
+ >>> config = configparser.RawConfigParser()
+ >>> config['DEFAULT'] = {'ServerAliveInterval': '45',
+ ... 'Compression': 'yes',
+ ... 'CompressionLevel': '9'}
+ >>> config['bitbucket.org'] = {}
+ >>> config['bitbucket.org']['User'] = 'hg'
+ >>> config['topsecret.server.com'] = {}
+ >>> topsecret = config['topsecret.server.com']
+ >>> topsecret['Port'] = '50022' # mutates the parser
+ >>> topsecret['ForwardX11'] = 'no' # same here
+ >>> config['DEFAULT']['ForwardX11'] = 'yes'
+ >>> with open('example.ini', 'w') as configfile:
+ ... config.write(configfile)
+ ...
+
+As you can see, we can treat a config parser just like a dictionary. There are
+a few differences, `outlined later on <#mapping-protocol-access>`_, but the
+behaviour is very close to what you'd expect from a dictionary.
+
+Now that we've created and saved a configuration file, let's try reading it
+back and exploring the data it holds.
+
+.. highlightlang:: python
+.. doctest::
+
+ >>> import configparser
+ >>> config = configparser.RawConfigParser()
+ >>> config.sections()
+ []
+ >>> config.read('example.ini')
+ ['example.ini']
+ >>> config.sections()
+ ['bitbucket.org', 'topsecret.server.com']
+ >>> 'bitbucket.org' in config
+ True
+ >>> 'bytebong.com' in config
+ False
+ >>> config['bitbucket.org']['User']
+ 'hg'
+ >>> config['DEFAULT']['Compression']
+ 'yes'
+ >>> topsecret = config['topsecret.server.com']
+ >>> topsecret['ForwardX11']
+ 'no'
+ >>> topsecret['Port']
+ '50022'
+ >>> for key in config['bitbucket.org']: print(key)
+ ...
+ user
+ compressionlevel
+ serveraliveinterval
+ compression
+ forwardx11
+ >>> config['bitbucket.org']['ForwardX11']
+ 'yes'
+
+As we can see above, the API is pretty straight forward. The only bit of magic
+involves the ``DEFAULT`` section which provides default values for all other
+sections [customizable]_. Another thing to note is that keys in sections are
+case-insensitive so they're stored in lowercase [customizable]_.
+
+Supported Datatypes
+-------------------
+
+Config parsers do not guess datatypes of values in configuration files, always
+storing them internally as strings. This means that if you need other datatypes,
+you should convert on your own:
+
+.. highlightlang:: python
+.. doctest::
+
+ >>> int(topsecret['Port'])
+ 50022
+ >>> float(topsecret['CompressionLevel'])
+ 9.0
+
+Converting to the boolean type is not that simple, though. Wrapping the return
+value around ``bool()`` would do us no good since ``bool('False')`` is still
+``True``. This is why config parsers also provide :meth:`getboolean`. This handy
+method is also case insensitive and correctly recognizes boolean values from
+``'yes'``/``'no'``, ``'on'``/``'off'`` and ``'1'``/``'0'`` [customizable]_. An
+example of getting the boolean value:
+
+.. highlightlang:: python
+.. doctest::
+
+ >>> topsecret.getboolean('ForwardX11')
+ False
+ >>> config['bitbucket.org'].getboolean('ForwardX11')
+ True
+ >>> config.getboolean('bitbucket.org', 'Compression')
+ True
+
+Apart from :meth:`getboolean`, config parsers also provide equivalent
+:meth:`getint` and :meth:`getfloat` methods but these are far less useful
+because explicit casting is enough for these types.
+
+Fallback Values
+---------------
+
+As with a regular dictionary, you can use a section's :meth:`get` method to
+provide fallback values:
+
+.. highlightlang:: python
+.. doctest::
+
+ >>> topsecret.get('Port')
+ '50022'
+ >>> topsecret.get('CompressionLevel')
+ '9'
+ >>> topsecret.get('Cipher')
+ >>> topsecret.get('Cipher', '3des-cbc')
+ '3des-cbc'
+
+Please note that default values have precedence over fallback values. For
+instance, in our example the ``CompressionLevel`` key was specified only in the
+``DEFAULT`` section. If we try to get it from the section
+``topsecret.server.com``, we will always get the default, even if we specify
+a fallback:
+
+.. highlightlang:: python
+.. doctest::
+
+ >>> topsecret.get('CompressionLevel', '3')
+ '9'
+
+One more thing to be aware of is that the parser-level :meth:`get` method
+provides a custom, more complex interface, maintained for backwards
+compatibility. When using this method, a fallback value can be provided via the
+``fallback`` keyword-only argument:
+
+.. highlightlang:: python
+.. doctest::
+
+ >>> config.get('bitbucket.org', 'monster',
+ ... fallback='No such things as monsters')
+ 'No such things as monsters'
+
+The same ``fallback`` argument can be used with the :meth:`getint`,
+:meth:`getfloat` and :meth:`getboolean` methods, for example:
+
+.. highlightlang:: python
+.. doctest::
+
+ >>> 'BatchMode' in topsecret
+ False
+ >>> topsecret.getboolean('BatchMode', fallback=True)
+ True
+ >>> config['DEFAULT']['BatchMode'] = 'no'
+ >>> topsecret.getboolean('BatchMode', fallback=True)
+ False
+
+Supported INI File Structure
+----------------------------
+
A configuration file consists of sections, each led by a ``[section]`` header,
followed by key/value entries separated by a specific string (``=`` or ``:`` by
-default). By default, section names are case sensitive but keys are not. Leading
-und trailing whitespace is removed from keys and from values. Values can be
-omitted, in which case the key/value delimiter may also be left out. Values
-can also span multiple lines, as long as they are indented deeper than the first
-line of the value. Depending on the parser's mode, blank lines may be treated
-as parts of multiline values or ignored.
+default [customizable]_). By default, section names are case sensitive but keys
+are not [customizable]_. Leading und trailing whitespace is removed from keys and from values.
+Values can be omitted, in which case the key/value delimiter may also be left
+out. Values can also span multiple lines, as long as they are indented deeper
+than the first line of the value. Depending on the parser's mode, blank lines
+may be treated as parts of multiline values or ignored.
Configuration files may include comments, prefixed by specific characters (``#``
-and ``;`` by default). Comments may appear on their own in an otherwise empty
-line, or may be entered in lines holding values or section names. In the
-latter case, they need to be preceded by a whitespace character to be recognized
-as a comment. (For backwards compatibility, by default only ``;`` starts an
-inline comment, while ``#`` does not.)
+and ``;`` by default [customizable]_). Comments may appear on their own in an
+otherwise empty line, or may be entered in lines holding values or section
+names. In the latter case, they need to be preceded by a whitespace character
+to be recognized as a comment. (For backwards compatibility, by default only
+``;`` starts an inline comment, while ``#`` does not [customizable]_.)
On top of the core functionality, :class:`SafeConfigParser` supports
interpolation. This means values can contain format strings which refer to
-other values in the same section, or values in a special ``DEFAULT`` section.
-Additional defaults can be provided on initialization.
+other values in the same section, or values in a special ``DEFAULT`` section
+[customizable]_. Additional defaults can be provided on initialization.
+
+.. highlightlang:: none
For example::
@@ -80,7 +275,6 @@ For example::
of a value
# Did I mention we can indent comments, too?
-
In the example above, :class:`SafeConfigParser` would resolve ``%(home_dir)s``
to the value of ``home_dir`` (``/Users`` in this case). ``%(my_dir)s`` in
effect would resolve to ``/Users/lumberjack``. All interpolations are done on
@@ -92,188 +286,438 @@ value of ``my_pictures`` and ``%(home_dir)s/lumberjack`` as the value of
``my_dir``. Other features presented in the example are handled in the same
manner by both parsers.
-Default values can be specified by passing them as a dictionary when
-constructing the :class:`SafeConfigParser`.
-
-Sections are normally stored in an :class:`collections.OrderedDict` which
-maintains the order of all keys. An alternative dictionary type can be passed
-to the :meth:`__init__` method. For example, if a dictionary type is passed
-that sorts its keys, the sections will be sorted on write-back, as will be the
-keys within each section.
-
-
-.. class:: RawConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=_COMPATIBLE, strict=False, empty_lines_in_values=True)
-
- The basic configuration object. When *defaults* is given, it is initialized
- into the dictionary of intrinsic defaults. When *dict_type* is given, it
- will be used to create the dictionary objects for the list of sections, for
- the options within a section, and for the default values.
-
- When *delimiters* is given, it will be used as the set of substrings 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, both for the whole
- line and inline comments. For backwards compatibility, the default value for
- *comment_prefixes* is a special value that indicates that ``;`` and ``#`` can
- start whole line comments while only ``;`` can start inline comments.
-
- When *strict* is ``True`` (default: ``False``), the parser won't allow for
- any section or option duplicates while reading from a single source (file,
- string or dictionary), raising :exc:`DuplicateSectionError` or
- :exc:`DuplicateOptionError`. When *empty_lines_in_values* is ``False``
- (default: ``True``), each empty line marks the end of an option. Otherwise,
- internal empty lines of a multiline option are kept as part of the value.
- When *allow_no_value* is ``True`` (default: ``False``), options without
- values are accepted; the value presented for these is ``None``.
-
- This class does not support the magical interpolation behavior.
-
- .. versionchanged:: 3.1
- The default *dict_type* is :class:`collections.OrderedDict`.
-
- .. versionchanged:: 3.2
- *allow_no_value*, *delimiters*, *comment_prefixes*, *strict* and
- *empty_lines_in_values* were added.
-
-
-.. class:: SafeConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=_COMPATIBLE, strict=False, empty_lines_in_values=True)
-
- Derived class of :class:`ConfigParser` that implements a sane variant of the
- magical interpolation feature. This implementation is more predictable as it
- validates the interpolation syntax used within a configuration file. This
- class also enables escaping the interpolation character (e.g. a key can have
- ``%`` as part of the value by specifying ``%%`` in the file).
-
- Applications that don't require interpolation should use
- :class:`RawConfigParser`, otherwise :class:`SafeConfigParser` is the best
- option.
-
- .. versionchanged:: 3.1
- The default *dict_type* is :class:`collections.OrderedDict`.
-
- .. versionchanged:: 3.2
- *allow_no_value*, *delimiters*, *comment_prefixes*, *strict* and
- *empty_lines_in_values* were added.
-
-
-.. class:: ConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=_COMPATIBLE, strict=False, empty_lines_in_values=True)
-
- Derived class of :class:`RawConfigParser` that implements the magical
- interpolation feature and adds optional arguments to the :meth:`get` and
- :meth:`items` methods.
-
- :class:`SafeConfigParser` is generally recommended over this class if you
- need interpolation.
-
- The values in *defaults* must be appropriate for the ``%()s`` string
- interpolation. Note that *__name__* is an intrinsic default; its value is
- the section name, and will override any value provided in *defaults*.
-
- All option names used in interpolation will be passed through the
- :meth:`optionxform` method just like any other option name reference. For
- example, using the default implementation of :meth:`optionxform` (which
- converts option names to lower case), the values ``foo %(bar)s`` and ``foo
- %(BAR)s`` are equivalent.
+Mapping Protocol Access
+-----------------------
- .. versionchanged:: 3.1
- The default *dict_type* is :class:`collections.OrderedDict`.
+.. versionadded:: 3.2
+.. highlightlang:: python
+
+Mapping protocol access is a generic name for functionality that enables using
+custom objects as if they were dictionaries. In case of :mod:`configparser`,
+the mapping interface implementation is using the
+``parser['section']['option']`` notation.
+
+``parser['section']`` in particular returns a proxy for the section's data in
+the parser. This means that the values are not copied but they are taken from
+the original parser on demand. What's even more important is that when values
+are changed on a section proxy, they are actually mutated in the original
+parser.
+
+:mod:`configparser` objects behave as close to actual dictionaries as possible.
+The mapping interface is complete and adheres to the ``MutableMapping`` ABC.
+However, there are a few differences that should be taken into account:
+
+* by default, all keys in sections are accessible in a case-insensitive manner
+ [customizable]_. E.g. ``for option in parser["section"]`` yields only
+ ``optionxform``'ed option key names. This means lowercased keys by default.
+ At the same time, for a section that holds the key ``"a"``, both expressions
+ return ``True``::
+
+ "a" in parser["section"]
+ "A" in parser["section"]
+
+* all sections include ``DEFAULTSECT`` values as well which means that
+ ``.clear()`` on a section may not leave the section visibly empty. This is
+ because default values cannot be deleted from the section (because technically
+ they are not there). If they are overriden in the section, deleting causes the
+ default value to be visible again. Trying to delete a default value causes
+ a ``KeyError``.
+
+* trying to delete the ``DEFAULTSECT`` throws ``ValueError``
+
+* there are two parser-level methods in the legacy API that hide
+ the dictionary interface and are incompatible:
+
+ * ``parser.get(section, option, **kwargs)`` - the second argument is **not**
+ a fallback value
+
+ * ``parser.items(section)`` - this returns a list of ``(option, value)``
+ pairs for a specified ``section``.
+
+The mapping protocol is implemented on top of the existing legacy API so that
+subclassing the original interface makes the mappings work as expected as well.
+One difference is the explicit lack of support for the `__name__` special key.
+This is because the existing behaviour of `__name__` is very inconsistent and
+supporting it would only lead to problems. Details `here
+<http://mail.python.org/pipermail/python-dev/2010-July/102556.html>`_.
+
+Customizing Parser Behaviour
+----------------------------
+
+There are nearly as many INI format variants as there are applications using it.
+:mod:`configparser` goes a long way to provide support for the largest sensible
+set of INI styles available. The default functionality is mainly dictated by
+historical background and it's very likely that you will want to customize some
+of the features.
+
+The most natural way to change the way a specific config parser works is to use
+the :meth:`__init__` options:
+
+* *defaults*, default value: ``None``
+
+ This option accepts a dictionary of key-value pairs which will be initially
+ put in the ``DEFAULTSECT``. This makes for an elegant way to support concise
+ configuration files that don't specify values which are the same as the
+ documented default.
+
+ Hint: if you want to specify default values for a specific section, use the
+ :meth:`read_dict` before you read the actual file.
+
+* *dict_type*, default value: :class:`collections.OrderedDict`
+
+ This option has a major impact on how the mapping protocol will behave and how
+ the written configuration files will look like. With the default ordered
+ dictionary, every section is stored in the order they were added to the
+ parser. Same goes for options within sections.
+
+ An alternative dictionary type can be used for example to sort sections and
+ options on write-back. You can also use a regular dictionary for performance
+ reasons.
+
+ Please note: there are ways to add a set of key-value pairs in a single
+ operation. When you use a regular dictionary in those operations, the order of
+ the keys may be random. For example:
+
+ .. highlightlang:: python
+ .. doctest::
+
+ >>> parser = configparser.RawConfigParser()
+ >>> parser.read_dict({'section1': {'key1': 'value1',
+ ... 'key2': 'value2',
+ ... 'key3': 'value3'},
+ ... 'section2': {'keyA': 'valueA',
+ ... 'keyB': 'valueB',
+ ... 'keyC': 'valueC'},
+ ... 'section3': {'foo': 'x',
+ ... 'bar': 'y',
+ ... 'baz': 'z'}
+ ... })
+ >>> parser.sections()
+ ['section3', 'section2', 'section1']
+ >>> [option for option in parser['section3']]
+ ['baz', 'foo', 'bar']
+
+ In these operations you need to use an ordered dictionary as well:
+
+ .. highlightlang:: python
+ .. doctest::
+
+ >>> from collections import OrderedDict
+ >>> parser = configparser.RawConfigParser()
+ >>> parser.read_dict(
+ ... OrderedDict((
+ ... ('s1',
+ ... OrderedDict((
+ ... ('1', '2'),
+ ... ('3', '4'),
+ ... ('5', '6'),
+ ... ))
+ ... ),
+ ... ('s2',
+ ... OrderedDict((
+ ... ('a', 'b'),
+ ... ('c', 'd'),
+ ... ('e', 'f'),
+ ... ))
+ ... ),
+ ... ))
+ ... )
+ >>> parser.sections()
+ ['s1', 's2']
+ >>> [option for option in parser['s1']]
+ ['1', '3', '5']
+ >>> [option for option in parser['s2'].values()]
+ ['b', 'd', 'f']
+
+* *allow_no_value*, default value: ``False``
+
+ Some configuration files are known to include settings without values, but
+ which otherwise conform to the syntax supported by :mod:`configparser`. The
+ *allow_no_value* parameter to the :meth:`__init__` method can be used to
+ indicate that such values should be accepted:
+
+ .. highlightlang:: python
+ .. doctest::
+
+ >>> import configparser
+
+ >>> sample_config = """
+ ... [mysqld]
+ ... user = mysql
+ ... pid-file = /var/run/mysqld/mysqld.pid
+ ... skip-external-locking
+ ... old_passwords = 1
+ ... skip-bdb
+ ... skip-innodb # we don't need ACID today
+ ... """
+ >>> config = configparser.RawConfigParser(allow_no_value=True)
+ >>> config.read_string(sample_config)
+
+ >>> # Settings with values are treated as before:
+ >>> config["mysqld"]["user"]
+ 'mysql'
+
+ >>> # Settings without values provide None:
+ >>> config["mysqld"]["skip-bdb"]
+
+ >>> # Settings which aren't specified still raise an error:
+ >>> config["mysqld"]["does-not-exist"]
+ Traceback (most recent call last):
+ ...
+ KeyError: 'does-not-exist'
- .. versionchanged:: 3.2
- *allow_no_value*, *delimiters*, *comment_prefixes*,
- *strict* and *empty_lines_in_values* were added.
+* *delimiters*, default value: ``('=', ':')``
+ Delimiters are substrings that delimit keys from values within a section. The
+ first occurence of a delimiting substring on a line is considered a delimiter.
+ This means values (but not keus) can contain substrings that are in the
+ *delimiters*.
+
+ See also the *space_around_delimiters* argument to
+ :meth:`RawConfigParser.write`.
+
+* *comment_prefixes*, default value: ``_COMPATIBLE`` (``'#'`` valid on empty
+ lines, ``';'`` valid also on non-empty lines)
+
+ Comment prefixes are substrings that indicate the start of a valid comment
+ within a config file. The peculiar default value allows for comments starting
+ with ``'#'`` or ``';'`` but only the latter can be used in a non-empty line.
+ This is obviously dictated by backwards compatibiliy. A more predictable
+ approach would be to specify prefixes as ``('#', ';')`` which will allow for
+ both prefixes to be used in non-empty lines.
+
+ Please note that config parsers don't support escaping of comment prefixes so
+ leaving characters out of *comment_prefixes* is a way of ensuring they can be
+ used as parts of keys or values.
+
+* *strict*, default value: ``False``
+
+ If set to ``True``, the parser will not allow for any section or option
+ duplicates while reading from a single source (using :meth:`read_file`,
+ :meth:`read_string` or :meth:`read_dict`). The default is ``False`` only
+ because of backwards compatibility reasons. It's recommended to use strict
+ parsers in new applications.
+
+* *empty_lines_in_values*, default value: ``True``
+
+ .. highlightlang:: none
+
+ In config parsers, values can be multiline as long as they're indented deeper
+ than the key that holds them. By default parsers also let empty lines to be
+ parts of values. At the same time, keys can be arbitrarily indented themselves
+ to improve readability. In consequence, when configuration files get big and
+ complex, it's easy for the user to lose track of the file structure. Take for
+ instance::
+
+ [Section]
+ key = multiline
+ value with a gotcha
+
+ this = is still a part of the multiline value of 'key'
+
+
+ This can be especially problematic for the user to see if she's using
+ a proportional font to edit the file. That's why when your application does
+ not need values with empty lines, you should consider disallowing them. This
+ will make empty lines split keys every time. In the example above, it would
+ produce two keys, ``key`` and ``this``.
+
+.. highlightlang:: python
+
+More advanced customization may be achieved by overriding default values of the
+following parser members:
+
+* `RawConfigParser.BOOLEAN_STATES`
+
+ By default when using :meth:`getboolean`, config parsers consider the
+ following values ``True``: ``'1'``, ``'yes'``, ``'true'``, ``'on'`` and the
+ following values ``False``: ``'0'``, ``'no'``, ``'false'``, ``'off'``. You can
+ override this by specifying a custom dictionary of strings and their boolean
+ outcomes. For example:
+
+ .. highlightlang:: python
+ .. doctest::
+
+ >>> custom = configparser.RawConfigParser()
+ >>> custom['section1'] = {'funky': 'nope'}
+ >>> custom['section1'].getboolean('funky')
+ Traceback (most recent call last):
+ ...
+ ValueError: Not a boolean: nope
+ >>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False}
+ >>> custom['section1'].getboolean('funky')
+ False
+
+ Other typical boolean pairs include ``accept``/``reject`` or
+ ``enabled``/``disabled``.
+
+* :meth:`RawConfigParser.optionxform`
+
+ This is a method that transforms option names on every read or set operation.
+ By default it converts the name to lowercase. This also means that when
+ a configuration file gets written, all keys will be lowercase. If you find
+ that behaviour unsuitable, you can override this method. For example:
+
+ .. highlightlang:: python
+ .. doctest::
+
+ >>> config = """
+ ... [Section1]
+ ... Key = Value
+ ...
+ ... [Section2]
+ ... AnotherKey = Value
+ ... """
+ >>> typical = configparser.RawConfigParser()
+ >>> typical.read_string(config)
+ >>> list(typical['Section1'].keys())
+ ['key']
+ >>> list(typical['Section2'].keys())
+ ['anotherkey']
+ >>> custom = configparser.RawConfigParser()
+ >>> custom.optionxform = lambda option: option
+ >>> custom.read_string(config)
+ >>> list(custom['Section1'].keys())
+ ['Key']
+ >>> list(custom['Section2'].keys())
+ ['AnotherKey']
+
+Legacy API Examples
+-------------------
+
+Mainly because of backwards compatibility concerns, :mod:`configparser`
+provides also a legacy API with explicit ``get``/``set`` methods. While there
+are valid use cases for the methods outlined below, mapping protocol access
+is preferred for new projects. The legacy API is at times more advanced,
+low-level and downright counterintuitive.
-.. exception:: Error
+An example of writing to a configuration file::
- Base class for all other configparser exceptions.
+ import configparser
+ config = configparser.RawConfigParser()
-.. exception:: NoSectionError
+ # Please note that using RawConfigParser's and the raw mode of
+ # ConfigParser's respective set functions, you can assign non-string values
+ # to keys internally, but will receive an error when attempting to write to
+ # a file or when you get it in non-raw mode. Setting values using the
+ # mapping protocol or SafeConfigParser's set() does not allow such
+ # assignments to take place.
+ config.add_section('Section1')
+ config.set('Section1', 'int', '15')
+ config.set('Section1', 'bool', 'true')
+ config.set('Section1', 'float', '3.1415')
+ config.set('Section1', 'baz', 'fun')
+ config.set('Section1', 'bar', 'Python')
+ config.set('Section1', 'foo', '%(bar)s is %(baz)s!')
- Exception raised when a specified section is not found.
+ # Writing our configuration file to 'example.cfg'
+ with open('example.cfg', 'w') as configfile:
+ config.write(configfile)
+An example of reading the configuration file again::
-.. exception:: DuplicateSectionError
+ import configparser
- Exception raised if :meth:`add_section` is called with the name of a section
- that is already present or in strict parsers when a section if found more
- than once in a single input file, string or dictionary.
+ config = configparser.RawConfigParser()
+ config.read('example.cfg')
- .. versionadded:: 3.2
- Optional ``source`` and ``lineno`` attributes and arguments to
- :meth:`__init__` were added.
+ # getfloat() raises an exception if the value is not a float
+ # getint() and getboolean() also do this for their respective types
+ float = config.getfloat('Section1', 'float')
+ int = config.getint('Section1', 'int')
+ print(float + int)
+ # Notice that the next output does not interpolate '%(bar)s' or '%(baz)s'.
+ # This is because we are using a RawConfigParser().
+ if config.getboolean('Section1', 'bool'):
+ print(config.get('Section1', 'foo'))
-.. exception:: DuplicateOptionError
+To get interpolation, you will need to use a :class:`SafeConfigParser` or, if
+you absolutely have to, a :class:`ConfigParser`::
- Exception raised by strict parsers if a single option appears twice during
- reading from a single file, string or dictionary. This catches misspellings
- and case sensitivity-related errors, e.g. a dictionary may have two keys
- representing the same case-insensitive configuration key.
+ import configparser
+ cfg = configparser.SafeConfigParser()
+ cfg.read('example.cfg')
-.. exception:: NoOptionError
+ # Set the optional `raw` argument of get() to True if you wish to disable
+ # interpolation in a single get operation.
+ print(cfg.get('Section1', 'foo', raw=False)) # -> "Python is fun!"
+ print(cfg.get('Section1', 'foo', raw=True)) # -> "%(bar)s is %(baz)s!"
- Exception raised when a specified option is not found in the specified
- section.
+ # The optional `vars` argument is a dict with members that will take
+ # precedence in interpolation.
+ print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation',
+ 'baz': 'evil'}))
+ # The optional `fallback` argument can be used to provide a fallback value
+ print(cfg.get('Section1', 'foo'))
+ # -> "Python is fun!"
-.. exception:: InterpolationError
+ print(cfg.get('Section1', 'foo', fallback='Monty is not.'))
+ # -> "Python is fun!"
- Base class for exceptions raised when problems occur performing string
- interpolation.
+ print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))
+ # -> "No such things as monsters."
+ # A bare print(cfg.get('Section1', 'monster')) would raise NoOptionError
+ # but we can also use:
-.. exception:: InterpolationDepthError
+ print(cfg.get('Section1', 'monster', fallback=None))
+ # -> None
- Exception raised when string interpolation cannot be completed because the
- number of iterations exceeds :const:`MAX_INTERPOLATION_DEPTH`. Subclass of
- :exc:`InterpolationError`.
+Defaults are available in all three types of ConfigParsers. They are used in
+interpolation if an option used is not defined elsewhere. ::
-.. exception:: InterpolationMissingOptionError
+ import configparser
- Exception raised when an option referenced from a value does not exist. Subclass
- of :exc:`InterpolationError`.
+ # New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each
+ config = configparser.SafeConfigParser({'bar': 'Life', 'baz': 'hard'})
+ config.read('example.cfg')
+ print(config.get('Section1', 'foo')) # -> "Python is fun!"
+ config.remove_option('Section1', 'bar')
+ config.remove_option('Section1', 'baz')
+ print(config.get('Section1', 'foo')) # -> "Life is hard!"
-.. exception:: InterpolationSyntaxError
+.. _rawconfigparser-objects:
- Exception raised when the source text into which substitutions are made does not
- conform to the required syntax. Subclass of :exc:`InterpolationError`.
+RawConfigParser Objects
+-----------------------
+.. class:: RawConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=_COMPATIBLE, strict=False, empty_lines_in_values=True)
-.. exception:: MissingSectionHeaderError
+ The basic configuration object. When *defaults* is given, it is initialized
+ into the dictionary of intrinsic defaults. When *dict_type* is given, it
+ will be used to create the dictionary objects for the list of sections, for
+ the options within a section, and for the default values.
- Exception raised when attempting to parse a file which has no section headers.
+ When *delimiters* is given, it will be used as the set of substrings 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, both for the whole
+ line and inline comments. For backwards compatibility, the default value for
+ *comment_prefixes* is a special value that indicates that ``;`` and ``#`` can
+ start whole line comments while only ``;`` can start inline comments.
+ When *strict* is ``True`` (default: ``False``), the parser won't allow for
+ any section or option duplicates while reading from a single source (file,
+ string or dictionary), raising :exc:`DuplicateSectionError` or
+ :exc:`DuplicateOptionError`. When *empty_lines_in_values* is ``False``
+ (default: ``True``), each empty line marks the end of an option. Otherwise,
+ internal empty lines of a multiline option are kept as part of the value.
+ When *allow_no_value* is ``True`` (default: ``False``), options without
+ values are accepted; the value presented for these is ``None``.
-.. exception:: ParsingError
+ This class does not support the magical interpolation behavior.
- Exception raised when errors occur attempting to parse a file.
+ .. versionchanged:: 3.1
+ The default *dict_type* is :class:`collections.OrderedDict`.
.. versionchanged:: 3.2
- The ``filename`` attribute and :meth:`__init__` argument were renamed to
- ``source`` for consistency.
-
-.. data:: MAX_INTERPOLATION_DEPTH
-
- The maximum depth for recursive interpolation for :meth:`get` when the *raw*
- parameter is false. This is relevant only for the :class:`ConfigParser` class.
-
-
-.. seealso::
-
- Module :mod:`shlex`
- Support for a creating Unix shell-like mini-languages which can be used as an
- alternate format for application configuration files.
-
-
-.. _rawconfigparser-objects:
-
-RawConfigParser Objects
------------------------
-
-:class:`RawConfigParser` instances have the following methods:
+ *allow_no_value*, *delimiters*, *comment_prefixes*, *strict* and
+ *empty_lines_in_values* were added.
.. method:: RawConfigParser.defaults()
@@ -373,29 +817,34 @@ RawConfigParser Objects
.. versionadded:: 3.2
-.. method:: RawConfigParser.get(section, option, [vars, default])
+.. method:: RawConfigParser.get(section, option, [vars, fallback])
Get an *option* value for the named *section*. If *vars* is provided, it
must be a dictionary. The *option* is looked up in *vars* (if provided),
*section*, and in *DEFAULTSECT* in that order. If the key is not found and
- *default* is provided, it is used as a fallback value. ``None`` can be
- provided as a *default* value.
+ *fallback* is provided, it is used as a fallback value. ``None`` can be
+ provided as a *fallback* value.
+
+ .. versionchanged:: 3.2
+ Arguments *vars* and *fallback* are keyword only to protect users from
+ trying to use the third argument as the *fallback* fallback (especially
+ when using the mapping protocol).
-.. method:: RawConfigParser.getint(section, option, [vars, default])
+.. method:: RawConfigParser.getint(section, option, [vars, fallback])
A convenience method which coerces the *option* in the specified *section* to
- an integer. See :meth:`get` for explanation of *vars* and *default*.
+ an integer. See :meth:`get` for explanation of *vars* and *fallback*.
-.. method:: RawConfigParser.getfloat(section, option, [vars, default])
+.. method:: RawConfigParser.getfloat(section, option, [vars, fallback])
A convenience method which coerces the *option* in the specified *section* to
a floating point number. See :meth:`get` for explanation of *vars* and
- *default*.
+ *fallback*.
-.. method:: RawConfigParser.getboolean(section, option, [vars, default])
+.. method:: RawConfigParser.getboolean(section, option, [vars, fallback])
A convenience method which coerces the *option* in the specified *section*
to a Boolean value. Note that the accepted values for the option are
@@ -403,30 +852,39 @@ RawConfigParser Objects
return ``True``, and ``"0"``, ``"no"``, ``"false"``, and ``"off"``, which
cause it to return ``False``. These string values are checked in
a case-insensitive manner. Any other value will cause it to raise
- :exc:`ValueError`. See :meth:`get` for explanation of *vars* and *default*.
+ :exc:`ValueError`. See :meth:`get` for explanation of *vars* and *fallback*.
.. method:: RawConfigParser.items(section)
- Return a list of ``(name, value)`` pairs for each option in the given *section*.
+ Return a list of ``(name, value)`` pairs for each option in the given
+ *section*.
.. method:: RawConfigParser.set(section, option, value)
If the given section exists, set the given option to the specified value;
otherwise raise :exc:`NoSectionError`. While it is possible to use
- :class:`RawConfigParser` (or :class:`ConfigParser` with *raw* parameters set to
- true) for *internal* storage of non-string values, full functionality (including
- interpolation and output to files) can only be achieved using string values.
+ :class:`RawConfigParser` (or :class:`ConfigParser` with *raw* parameters set
+ to true) for *internal* storage of non-string values, full functionality
+ (including interpolation and output to files) can only be achieved using
+ string values.
+
+.. warning::
+
+ This method lets users assign non-string values to keys internally. This
+ behaviour is unsupported and will cause errors when attempting to write to
+ a file or get it in non-raw mode. **Use the mapping protocol API** which does
+ not allow such assignments to take place.
.. method:: RawConfigParser.write(fileobject, space_around_delimiters=True)
- Write a representation of the configuration to the specified :term:`file object`,
- which must be opened in text mode (accepting strings). This representation
- can be parsed by a future :meth:`read` call. If ``space_around_delimiters``
- is ``True`` (the default), delimiters between keys and values are surrounded
- by spaces.
+ Write a representation of the configuration to the specified
+ :term:`file object`, which must be opened in text mode (accepting strings).
+ This representation can be parsed by a future :meth:`read` call. If
+ ``space_around_delimiters`` is ``True`` (the default), delimiters between
+ keys and values are surrounded by spaces.
.. method:: RawConfigParser.remove_option(section, option)
@@ -474,39 +932,72 @@ RawConfigParser Objects
ConfigParser Objects
--------------------
+.. warning::
+ Whenever you can, consider using :class:`SafeConfigParser` which
+ adds validation and escaping for the interpolation.
+
The :class:`ConfigParser` class extends some methods of the
-:class:`RawConfigParser` interface, adding some optional arguments. Whenever you
-can, consider using :class:`SafeConfigParser` which adds validation and escaping
-for the interpolation.
+:class:`RawConfigParser` interface, adding some optional arguments.
+.. class:: ConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=_COMPATIBLE, strict=False, empty_lines_in_values=True)
-.. method:: ConfigParser.get(section, option, raw=False, [vars, default])
+ Derived class of :class:`RawConfigParser` that implements the magical
+ interpolation feature and adds optional arguments to the :meth:`get` and
+ :meth:`items` methods.
+
+ :class:`SafeConfigParser` is generally recommended over this class if you
+ need interpolation.
+
+ The values in *defaults* must be appropriate for the ``%()s`` string
+ interpolation. Note that *__name__* is an intrinsic default; its value is
+ the section name, and will override any value provided in *defaults*.
+
+ All option names used in interpolation will be passed through the
+ :meth:`optionxform` method just like any other option name reference. For
+ example, using the default implementation of :meth:`optionxform` (which
+ converts option names to lower case), the values ``foo %(bar)s`` and ``foo
+ %(BAR)s`` are equivalent.
+
+ .. versionchanged:: 3.1
+ The default *dict_type* is :class:`collections.OrderedDict`.
+
+ .. versionchanged:: 3.2
+ *allow_no_value*, *delimiters*, *comment_prefixes*,
+ *strict* and *empty_lines_in_values* were added.
+
+
+.. method:: ConfigParser.get(section, option, raw=False, [vars, fallback])
Get an *option* value for the named *section*. If *vars* is provided, it
must be a dictionary. The *option* is looked up in *vars* (if provided),
*section*, and in *DEFAULTSECT* in that order. If the key is not found and
- *default* is provided, it is used as a fallback value. ``None`` can be
- provided as a *default* value.
+ *fallback* is provided, it is used as a fallback value. ``None`` can be
+ provided as a *fallback* value.
All the ``'%'`` interpolations are expanded in the return values, unless the
*raw* argument is true. Values for interpolation keys are looked up in the
same manner as the option.
+ .. versionchanged:: 3.2
+ Arguments *raw*, *vars* and *fallback* are keyword only to protect users
+ from trying to use the third argument as the *fallback* fallback
+ (especially when using the mapping protocol).
+
-.. method:: ConfigParser.getint(section, option, raw=False, [vars, default])
+.. method:: ConfigParser.getint(section, option, raw=False, [vars, fallback])
A convenience method which coerces the *option* in the specified *section* to
- an integer. See :meth:`get` for explanation of *raw*, *vars* and *default*.
+ an integer. See :meth:`get` for explanation of *raw*, *vars* and *fallback*.
-.. method:: ConfigParser.getfloat(section, option, raw=False, [vars, default])
+.. method:: ConfigParser.getfloat(section, option, raw=False, [vars, fallback])
A convenience method which coerces the *option* in the specified *section* to
a floating point number. See :meth:`get` for explanation of *raw*, *vars*
- and *default*.
+ and *fallback*.
-.. method:: ConfigParser.getboolean(section, option, raw=False, [vars, default])
+.. method:: ConfigParser.getboolean(section, option, raw=False, [vars, fallback])
A convenience method which coerces the *option* in the specified *section*
to a Boolean value. Note that the accepted values for the option are
@@ -515,7 +1006,7 @@ for the interpolation.
cause it to return ``False``. These string values are checked in
a case-insensitive manner. Any other value will cause it to raise
:exc:`ValueError`. See :meth:`get` for explanation of *raw*, *vars* and
- *default*.
+ *fallback*.
.. method:: ConfigParser.items(section, raw=False, vars=None)
@@ -525,15 +1016,39 @@ for the interpolation.
method.
+.. data:: MAX_INTERPOLATION_DEPTH
+
+ The maximum depth for recursive interpolation for :meth:`get` when the *raw*
+ parameter is false. This is relevant only for the :class:`ConfigParser` class.
+
.. _safeconfigparser-objects:
SafeConfigParser Objects
------------------------
+.. class:: SafeConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=_COMPATIBLE, strict=False, empty_lines_in_values=True)
+
+ Derived class of :class:`ConfigParser` that implements a sane variant of the
+ magical interpolation feature. This implementation is more predictable as it
+ validates the interpolation syntax used within a configuration file. This
+ class also enables escaping the interpolation character (e.g. a key can have
+ ``%`` as part of the value by specifying ``%%`` in the file).
+
+ Applications that don't require interpolation should use
+ :class:`RawConfigParser`, otherwise :class:`SafeConfigParser` is the best
+ option.
+
+ .. versionchanged:: 3.1
+ The default *dict_type* is :class:`collections.OrderedDict`.
+
+ .. versionchanged:: 3.2
+ *allow_no_value*, *delimiters*, *comment_prefixes*, *strict* and
+ *empty_lines_in_values* were added.
+
+
The :class:`SafeConfigParser` class implements the same extended interface as
:class:`ConfigParser`, with the following addition:
-
.. method:: SafeConfigParser.set(section, option, value)
If the given section exists, set the given option to the specified value;
@@ -541,126 +1056,82 @@ The :class:`SafeConfigParser` class implements the same extended interface as
not, :exc:`TypeError` is raised.
-Examples
---------
+Exceptions
+----------
-An example of writing to a configuration file::
+.. exception:: Error
- import configparser
+ Base class for all other configparser exceptions.
- config = configparser.RawConfigParser()
- # When adding sections or items, add them in the reverse order of
- # how you want them to be displayed in the actual file.
- # In addition, please note that using RawConfigParser's and the raw
- # mode of ConfigParser's respective set functions, you can assign
- # non-string values to keys internally, but will receive an error
- # when attempting to write to a file or when you get it in non-raw
- # mode. SafeConfigParser does not allow such assignments to take place.
- config.add_section('Section1')
- config.set('Section1', 'int', '15')
- config.set('Section1', 'bool', 'true')
- config.set('Section1', 'float', '3.1415')
- config.set('Section1', 'baz', 'fun')
- config.set('Section1', 'bar', 'Python')
- config.set('Section1', 'foo', '%(bar)s is %(baz)s!')
+.. exception:: NoSectionError
- # Writing our configuration file to 'example.cfg'
- with open('example.cfg', 'w') as configfile:
- config.write(configfile)
+ Exception raised when a specified section is not found.
-An example of reading the configuration file again::
- import configparser
+.. exception:: DuplicateSectionError
- config = configparser.RawConfigParser()
- config.read('example.cfg')
+ Exception raised if :meth:`add_section` is called with the name of a section
+ that is already present or in strict parsers when a section if found more
+ than once in a single input file, string or dictionary.
- # getfloat() raises an exception if the value is not a float
- # getint() and getboolean() also do this for their respective types
- float = config.getfloat('Section1', 'float')
- int = config.getint('Section1', 'int')
- print(float + int)
+ .. versionadded:: 3.2
+ Optional ``source`` and ``lineno`` attributes and arguments to
+ :meth:`__init__` were added.
- # Notice that the next output does not interpolate '%(bar)s' or '%(baz)s'.
- # This is because we are using a RawConfigParser().
- if config.getboolean('Section1', 'bool'):
- print(config.get('Section1', 'foo'))
-To get interpolation, you will need to use a :class:`ConfigParser` or
-:class:`SafeConfigParser`::
+.. exception:: DuplicateOptionError
- import configparser
+ Exception raised by strict parsers if a single option appears twice during
+ reading from a single file, string or dictionary. This catches misspellings
+ and case sensitivity-related errors, e.g. a dictionary may have two keys
+ representing the same case-insensitive configuration key.
- config = configparser.ConfigParser()
- config.read('example.cfg')
- # Set the third, optional argument of get to 1 if you wish to use raw mode.
- print(config.get('Section1', 'foo', 0)) # -> "Python is fun!"
- print(config.get('Section1', 'foo', 1)) # -> "%(bar)s is %(baz)s!"
+.. exception:: NoOptionError
- # The optional fourth argument is a dict with members that will take
- # precedence in interpolation.
- print(config.get('Section1', 'foo', 0, {'bar': 'Documentation',
- 'baz': 'evil'}))
+ Exception raised when a specified option is not found in the specified
+ section.
-Defaults are available in all three types of ConfigParsers. They are used in
-interpolation if an option used is not defined elsewhere. ::
- import configparser
+.. exception:: InterpolationError
- # New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each
- config = configparser.SafeConfigParser({'bar': 'Life', 'baz': 'hard'})
- config.read('example.cfg')
+ Base class for exceptions raised when problems occur performing string
+ interpolation.
- print(config.get('Section1', 'foo')) # -> "Python is fun!"
- config.remove_option('Section1', 'bar')
- config.remove_option('Section1', 'baz')
- print(config.get('Section1', 'foo')) # -> "Life is hard!"
-The function ``opt_move`` below can be used to move options between sections::
+.. exception:: InterpolationDepthError
- def opt_move(config, section1, section2, option):
- try:
- config.set(section2, option, config.get(section1, option, 1))
- except configparser.NoSectionError:
- # Create non-existent section
- config.add_section(section2)
- opt_move(config, section1, section2, option)
- else:
- config.remove_option(section1, option)
+ Exception raised when string interpolation cannot be completed because the
+ number of iterations exceeds :const:`MAX_INTERPOLATION_DEPTH`. Subclass of
+ :exc:`InterpolationError`.
-Some configuration files are known to include settings without values, but which
-otherwise conform to the syntax supported by :mod:`configparser`. The
-*allow_no_value* parameter to the :meth:`__init__` method can be used to
-indicate that such values should be accepted:
-.. doctest::
+.. exception:: InterpolationMissingOptionError
+
+ Exception raised when an option referenced from a value does not exist. Subclass
+ of :exc:`InterpolationError`.
+
+
+.. exception:: InterpolationSyntaxError
+
+ Exception raised when the source text into which substitutions are made does not
+ conform to the required syntax. Subclass of :exc:`InterpolationError`.
+
+
+.. exception:: MissingSectionHeaderError
+
+ Exception raised when attempting to parse a file which has no section headers.
+
+
+.. exception:: ParsingError
+
+ Exception raised when errors occur attempting to parse a file.
+
+ .. versionchanged:: 3.2
+ The ``filename`` attribute and :meth:`__init__` argument were renamed to
+ ``source`` for consistency.
- >>> import configparser
- >>> import io
-
- >>> sample_config = """
- ... [mysqld]
- ... user = mysql
- ... pid-file = /var/run/mysqld/mysqld.pid
- ... skip-external-locking
- ... old_passwords = 1
- ... skip-bdb
- ... skip-innodb # we don't need ACID today
- ... """
- >>> config = configparser.RawConfigParser(allow_no_value=True)
- >>> config.read_file(io.BytesIO(sample_config))
-
- >>> # Settings with values are treated as before:
- >>> config.get("mysqld", "user")
- 'mysql'
-
- >>> # Settings without values provide None:
- >>> config.get("mysqld", "skip-bdb")
-
- >>> # Settings which aren't specified still raise an error:
- >>> config.get("mysqld", "does-not-exist")
- Traceback (most recent call last):
- ...
- configparser.NoOptionError: No option 'does-not-exist' in section: 'mysqld'
+.. [customizable] Config parsers allow for very heavy customization. If you're
+ interested in changing the behaviour outlined by the footnote
+ reference, consult the `Customizing Parser Behaviour`_ section.