Team Ai
Apppublic

parthtamu/rag-code-assistant

sourceHugging Faceupdated 7mo agoView on Hugging Face
0likes
configparser.html1779 linesDownload Raw Back to docs
1<!DOCTYPE html>2 3<html lang="en" data-content_root="../">4  <head>5    <meta charset="utf-8" />6    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />7<meta property="og:title" content="configparser — Configuration file parser" />8<meta property="og:type" content="website" />9<meta property="og:url" content="https://docs.python.org/3/library/configparser.html" />10<meta property="og:site_name" content="Python documentation" />11<meta property="og:description" content="Source code: Lib/configparser.py This module provides the ConfigParser class which implements a basic configuration language which provides a structure similar to what’s found in Microsoft Windows ..." />12<meta property="og:image:width" content="1146" />13<meta property="og:image:height" content="600" />14<meta property="og:image" content="https://docs.python.org/3.15/_images/social_previews/summary_library_configparser_95794986.png" />15<meta property="og:image:alt" content="Source code: Lib/configparser.py This module provides the ConfigParser class which implements a basic configuration language which provides a structure similar to what’s found in Microsoft Windows ..." />16<meta name="description" content="Source code: Lib/configparser.py This module provides the ConfigParser class which implements a basic configuration language which provides a structure similar to what’s found in Microsoft Windows ..." />17<meta name="twitter:card" content="summary_large_image" />18<meta name="theme-color" content="#3776ab">19 20    <title>configparser — Configuration file parser &#8212; Python 3.15.0a6 documentation</title><meta name="viewport" content="width=device-width, initial-scale=1.0">21    22    <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=b86133f3" />23    <link rel="stylesheet" type="text/css" href="../_static/classic.css?v=234b1a7c" />24    <link rel="stylesheet" type="text/css" href="../_static/pydoctheme.css?v=89a2f22a" />25    <link rel="stylesheet" type="text/css" href="../_static/profiling-sampling-visualization.css?v=0c2600ae" />26    <link id="pygments_dark_css" media="(prefers-color-scheme: dark)" rel="stylesheet" type="text/css" href="../_static/pygments_dark.css?v=5349f25f" />27    28    <script src="../_static/documentation_options.js?v=6b7c9ff5"></script>29    <script src="../_static/doctools.js?v=9bcbadda"></script>30    <script src="../_static/sphinx_highlight.js?v=dc90522c"></script>31    <script src="../_static/profiling-sampling-visualization.js?v=9811ed04"></script>32    33    <script src="../_static/sidebar.js"></script>34    35    <link rel="search" type="application/opensearchdescription+xml"36          title="Search within Python 3.15.0a6 documentation"37          href="../_static/opensearch.xml"/>38    <link rel="author" title="About these documents" href="../about.html" />39    <link rel="index" title="Index" href="../genindex.html" />40    <link rel="search" title="Search" href="../search.html" />41    <link rel="copyright" title="Copyright" href="../copyright.html" />42    <link rel="next" title="tomllib — Parse TOML files" href="tomllib.html" />43    <link rel="prev" title="csv — CSV File Reading and Writing" href="csv.html" />44    45      46      <script defer file-types="bz2,epub,zip" data-domain="docs.python.org" src="https://analytics.python.org/js/script.file-downloads.outbound-links.js"></script>47      48      <link rel="canonical" href="https://docs.python.org/3/library/configparser.html">49      50    51 52    53    <style>54      @media only screen {55        table.full-width-table {56            width: 100%;57        }58      }59    </style>60<link rel="stylesheet" href="../_static/pydoctheme_dark.css" media="(prefers-color-scheme: dark)" id="pydoctheme_dark_css">61    <link rel="shortcut icon" type="image/png" href="../_static/py.svg">62            <script type="text/javascript" src="../_static/copybutton.js"></script>63            <script type="text/javascript" src="../_static/menu.js"></script>64            <script type="text/javascript" src="../_static/search-focus.js"></script>65            <script type="text/javascript" src="../_static/themetoggle.js"></script> 66            <script type="text/javascript" src="../_static/rtd_switcher.js"></script>67            <meta name="readthedocs-addons-api-version" content="1">68 69  </head>70<body>71<div class="mobile-nav">72    <input type="checkbox" id="menuToggler" class="toggler__input" aria-controls="navigation"73           aria-pressed="false" aria-expanded="false" role="button" aria-label="Menu">74    <nav class="nav-content" role="navigation">75        <label for="menuToggler" class="toggler__label">76            <span></span>77        </label>78        <span class="nav-items-wrapper">79            <a href="https://www.python.org/" class="nav-logo">80                <img src="../_static/py.svg" alt="Python logo">81            </a>82            <span class="version_switcher_placeholder"></span>83            <form role="search" class="search" action="../search.html" method="get">84                <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" class="search-icon">85                    <path fill-rule="nonzero" fill="currentColor" d="M15.5 14h-.79l-.28-.27a6.5 6.5 0 001.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 00-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 005.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path>86                </svg>87                <input placeholder="Quick search" aria-label="Quick search" type="search" name="q">88                <input type="submit" value="Go">89            </form>90        </span>91    </nav>92    <div class="menu-wrapper">93        <nav class="menu" role="navigation" aria-label="main navigation">94            <div class="language_switcher_placeholder"></div>95            96<label class="theme-selector-label">97    Theme98    <select class="theme-selector" oninput="activateTheme(this.value)">99        <option value="auto" selected>Auto</option>100        <option value="light">Light</option>101        <option value="dark">Dark</option>102    </select>103</label>104  <div>105    <h3><a href="../contents.html">Table of Contents</a></h3>106    <ul>107<li><a class="reference internal" href="#"><code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code> — Configuration file parser</a><ul>108<li><a class="reference internal" href="#quick-start">Quick Start</a></li>109<li><a class="reference internal" href="#supported-datatypes">Supported Datatypes</a></li>110<li><a class="reference internal" href="#fallback-values">Fallback Values</a></li>111<li><a class="reference internal" href="#supported-ini-file-structure">Supported INI File Structure</a></li>112<li><a class="reference internal" href="#unnamed-sections">Unnamed Sections</a></li>113<li><a class="reference internal" href="#interpolation-of-values">Interpolation of values</a></li>114<li><a class="reference internal" href="#mapping-protocol-access">Mapping Protocol Access</a></li>115<li><a class="reference internal" href="#customizing-parser-behaviour">Customizing Parser Behaviour</a></li>116<li><a class="reference internal" href="#legacy-api-examples">Legacy API Examples</a></li>117<li><a class="reference internal" href="#configparser-objects">ConfigParser Objects</a></li>118<li><a class="reference internal" href="#rawconfigparser-objects">RawConfigParser Objects</a></li>119<li><a class="reference internal" href="#exceptions">Exceptions</a></li>120</ul>121</li>122</ul>123 124  </div>125  <div>126    <h4>Previous topic</h4>127    <p class="topless"><a href="csv.html"128                          title="previous chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">csv</span></code> — CSV File Reading and Writing</a></p>129  </div>130  <div>131    <h4>Next topic</h4>132    <p class="topless"><a href="tomllib.html"133                          title="next chapter"><code class="xref py py-mod docutils literal notranslate"><span class="pre">tomllib</span></code> — Parse TOML files</a></p>134  </div>135  <script>136    document.addEventListener('DOMContentLoaded', () => {137        const title = document.querySelector('meta[property="og:title"]').content;138        const elements = document.querySelectorAll('.improvepage');139        const pageurl = window.location.href.split('?')[0];140        elements.forEach(element => {141            const url = new URL(element.href.split('?')[0].replace("-nojs", ""));142            url.searchParams.set('pagetitle', title);143            url.searchParams.set('pageurl', pageurl);144            url.searchParams.set('pagesource', "library/configparser.rst");145            element.href = url.toString();146        });147    });148  </script>149  <div role="note" aria-label="source link">150    <h3>This page</h3>151    <ul class="this-page-menu">152      <li><a href="../bugs.html">Report a bug</a></li>153      <li><a class="improvepage" href="../improve-page-nojs.html">Improve this page</a></li>154      <li>155        <a href="https://github.com/python/cpython/blob/main/Doc/library/configparser.rst?plain=1"156            rel="nofollow">Show source157        </a>158      </li>159      160    </ul>161  </div>162        </nav>163    </div>164</div>165 166  167    <div class="related" role="navigation" aria-label="Related">168      <h3>Navigation</h3>169      <ul>170        <li class="right" style="margin-right: 10px">171          <a href="../genindex.html" title="General Index"172             accesskey="I">index</a></li>173        <li class="right" >174          <a href="../py-modindex.html" title="Python Module Index"175             >modules</a> |</li>176        <li class="right" >177          <a href="tomllib.html" title="tomllib — Parse TOML files"178             accesskey="N">next</a> |</li>179        <li class="right" >180          <a href="csv.html" title="csv — CSV File Reading and Writing"181             accesskey="P">previous</a> |</li>182 183          <li><img src="../_static/py.svg" alt="Python logo" style="vertical-align: middle; margin-top: -1px"></li>184          <li><a href="https://www.python.org/">Python</a> &#187;</li>185          <li class="switchers">186            <div class="language_switcher_placeholder"></div>187            <div class="version_switcher_placeholder"></div>188          </li>189          <li>190              191          </li>192    <li id="cpython-language-and-version">193      <a href="../index.html">3.15.0a6 Documentation</a> &#187;194    </li>195 196          <li class="nav-item nav-item-1"><a href="index.html" >The Python Standard Library</a> &#187;</li>197          <li class="nav-item nav-item-2"><a href="fileformats.html" accesskey="U">File Formats</a> &#187;</li>198        <li class="nav-item nav-item-this"><a href=""><code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code> — Configuration file parser</a></li>199                <li class="right">200                    201 202    <div class="inline-search" role="search">203        <form class="inline-search" action="../search.html" method="get">204          <input placeholder="Quick search" aria-label="Quick search" type="search" name="q" id="search-box">205          <input type="submit" value="Go">206        </form>207    </div>208                     |209                </li>210            <li class="right">211<label class="theme-selector-label">212    Theme213    <select class="theme-selector" oninput="activateTheme(this.value)">214        <option value="auto" selected>Auto</option>215        <option value="light">Light</option>216        <option value="dark">Dark</option>217    </select>218</label> |</li>219            220      </ul>221    </div>    222 223    <div class="document">224      <div class="documentwrapper">225        <div class="bodywrapper">226          <div class="body" role="main">227            228  <section id="module-configparser">229<span id="configparser-configuration-file-parser"></span><h1><code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code> — Configuration file parser<a class="headerlink" href="#module-configparser" title="Link to this heading">¶</a></h1>230<p><strong>Source code:</strong> <a class="extlink-source reference external" href="https://github.com/python/cpython/tree/main/Lib/configparser.py">Lib/configparser.py</a></p>231<hr class="docutils" id="index-0" />232<p>This module provides the <a class="reference internal" href="#configparser.ConfigParser" title="configparser.ConfigParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConfigParser</span></code></a> class which implements a basic233configuration language which provides a structure similar to what’s found in234Microsoft Windows INI files.  You can use this to write Python programs which235can be customized by end users easily.</p>236<div class="admonition note">237<p class="admonition-title">Note</p>238<p>This library does <em>not</em> interpret or write the value-type prefixes used in239the Windows Registry extended version of INI syntax.</p>240</div>241<div class="admonition seealso">242<p class="admonition-title">See also</p>243<dl class="simple">244<dt>Module <a class="reference internal" href="tomllib.html#module-tomllib" title="tomllib: Parse TOML files."><code class="xref py py-mod docutils literal notranslate"><span class="pre">tomllib</span></code></a></dt><dd><p>TOML is a well-specified format for application configuration files.245It is specifically designed to be an improved version of INI.</p>246</dd>247<dt>Module <a class="reference internal" href="shlex.html#module-shlex" title="shlex: Simple lexical analysis for Unix shell-like languages."><code class="xref py py-mod docutils literal notranslate"><span class="pre">shlex</span></code></a></dt><dd><p>Support for creating Unix shell-like mini-languages which can also248be used for application configuration files.</p>249</dd>250<dt>Module <a class="reference internal" href="json.html#module-json" title="json: Encode and decode the JSON format."><code class="xref py py-mod docutils literal notranslate"><span class="pre">json</span></code></a></dt><dd><p>The <code class="docutils literal notranslate"><span class="pre">json</span></code> module implements a subset of JavaScript syntax which is251sometimes used for configuration, but does not support comments.</p>252</dd>253</dl>254</div>255<section id="quick-start">256<h2>Quick Start<a class="headerlink" href="#quick-start" title="Link to this heading">¶</a></h2>257<p>Let’s take a very basic configuration file that looks like this:</p>258<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[DEFAULT]</span>259<span class="na">ServerAliveInterval</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">45</span>260<span class="na">Compression</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">yes</span>261<span class="na">CompressionLevel</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">9</span>262<span class="na">ForwardX11</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">yes</span>263 264<span class="k">[forge.example]</span>265<span class="na">User</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">hg</span>266 267<span class="k">[topsecret.server.example]</span>268<span class="na">Port</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">50022</span>269<span class="na">ForwardX11</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">no</span>270</pre></div>271</div>272<p>The structure of INI files is described <a class="reference external" href="#supported-ini-file-structure">in the following section</a>.  Essentially, the file273consists of sections, each of which contains keys with values.274<code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code> classes can read and write such files.  Let’s start by275creating the above configuration file programmatically.</p>276<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span><span class="w"> </span><span class="nn">configparser</span>277<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>278<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;ServerAliveInterval&#39;</span><span class="p">:</span> <span class="s1">&#39;45&#39;</span><span class="p">,</span>279<span class="gp">... </span>                     <span class="s1">&#39;Compression&#39;</span><span class="p">:</span> <span class="s1">&#39;yes&#39;</span><span class="p">,</span>280<span class="gp">... </span>                     <span class="s1">&#39;CompressionLevel&#39;</span><span class="p">:</span> <span class="s1">&#39;9&#39;</span><span class="p">}</span>281<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;forge.example&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>282<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;forge.example&#39;</span><span class="p">][</span><span class="s1">&#39;User&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;hg&#39;</span>283<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;topsecret.server.example&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>284<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s1">&#39;topsecret.server.example&#39;</span><span class="p">]</span>285<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="p">[</span><span class="s1">&#39;Port&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;50022&#39;</span>     <span class="c1"># mutates the parser</span>286<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="p">[</span><span class="s1">&#39;ForwardX11&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;no&#39;</span>  <span class="c1"># same here</span>287<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">][</span><span class="s1">&#39;ForwardX11&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;yes&#39;</span>288<span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;example.ini&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">configfile</span><span class="p">:</span>289<span class="gp">... </span>  <span class="n">config</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">configfile</span><span class="p">)</span>290<span class="gp">...</span>291</pre></div>292</div>293<p>As you can see, we can treat a config parser much like a dictionary.294There are differences, <a class="reference external" href="#mapping-protocol-access">outlined later</a>, but295the behavior is very close to what you would expect from a dictionary.</p>296<p>Now that we have created and saved a configuration file, let’s read it297back and explore the data it holds.</p>298<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">config</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>299<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="o">.</span><span class="n">sections</span><span class="p">()</span>300<span class="go">[]</span>301<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">&#39;example.ini&#39;</span><span class="p">)</span>302<span class="go">[&#39;example.ini&#39;]</span>303<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="o">.</span><span class="n">sections</span><span class="p">()</span>304<span class="go">[&#39;forge.example&#39;, &#39;topsecret.server.example&#39;]</span>305<span class="gp">&gt;&gt;&gt; </span><span class="s1">&#39;forge.example&#39;</span> <span class="ow">in</span> <span class="n">config</span>306<span class="go">True</span>307<span class="gp">&gt;&gt;&gt; </span><span class="s1">&#39;python.org&#39;</span> <span class="ow">in</span> <span class="n">config</span>308<span class="go">False</span>309<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;forge.example&#39;</span><span class="p">][</span><span class="s1">&#39;User&#39;</span><span class="p">]</span>310<span class="go">&#39;hg&#39;</span>311<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">][</span><span class="s1">&#39;Compression&#39;</span><span class="p">]</span>312<span class="go">&#39;yes&#39;</span>313<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s1">&#39;topsecret.server.example&#39;</span><span class="p">]</span>314<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="p">[</span><span class="s1">&#39;ForwardX11&#39;</span><span class="p">]</span>315<span class="go">&#39;no&#39;</span>316<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="p">[</span><span class="s1">&#39;Port&#39;</span><span class="p">]</span>317<span class="go">&#39;50022&#39;</span>318<span class="gp">&gt;&gt;&gt; </span><span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">config</span><span class="p">[</span><span class="s1">&#39;forge.example&#39;</span><span class="p">]:</span>319<span class="gp">... </span>    <span class="nb">print</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>320<span class="go">user</span>321<span class="go">compressionlevel</span>322<span class="go">serveraliveinterval</span>323<span class="go">compression</span>324<span class="go">forwardx11</span>325<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;forge.example&#39;</span><span class="p">][</span><span class="s1">&#39;ForwardX11&#39;</span><span class="p">]</span>326<span class="go">&#39;yes&#39;</span>327</pre></div>328</div>329<p>As we can see above, the API is pretty straightforward.  The only bit of magic330involves the <code class="docutils literal notranslate"><span class="pre">DEFAULT</span></code> section which provides default values for all other331sections <a class="footnote-reference brackets" href="#id16" id="id1" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>.  Note also that keys in sections are332case-insensitive and stored in lowercase <a class="footnote-reference brackets" href="#id16" id="id2" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>.</p>333<p>It is possible to read several configurations into a single334<a class="reference internal" href="#configparser.ConfigParser" title="configparser.ConfigParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConfigParser</span></code></a>, where the most recently added configuration has the335highest priority. Any conflicting keys are taken from the more recent336configuration while the previously existing keys are retained. The example337below reads in an <code class="docutils literal notranslate"><span class="pre">override.ini</span></code> file, which will override any conflicting338keys from the <code class="docutils literal notranslate"><span class="pre">example.ini</span></code> file.</p>339<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[DEFAULT]</span>340<span class="na">ServerAliveInterval</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">-1</span>341</pre></div>342</div>343<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">config_override</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>344<span class="gp">&gt;&gt;&gt; </span><span class="n">config_override</span><span class="p">[</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;ServerAliveInterval&#39;</span><span class="p">:</span> <span class="s1">&#39;-1&#39;</span><span class="p">}</span>345<span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;override.ini&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">configfile</span><span class="p">:</span>346<span class="gp">... </span>    <span class="n">config_override</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">configfile</span><span class="p">)</span>347<span class="gp">...</span>348<span class="gp">&gt;&gt;&gt; </span><span class="n">config_override</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>349<span class="gp">&gt;&gt;&gt; </span><span class="n">config_override</span><span class="o">.</span><span class="n">read</span><span class="p">([</span><span class="s1">&#39;example.ini&#39;</span><span class="p">,</span> <span class="s1">&#39;override.ini&#39;</span><span class="p">])</span>350<span class="go">[&#39;example.ini&#39;, &#39;override.ini&#39;]</span>351<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">config_override</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">,</span> <span class="s1">&#39;ServerAliveInterval&#39;</span><span class="p">))</span>352<span class="go">-1</span>353</pre></div>354</div>355<p>This behaviour is equivalent to a <a class="reference internal" href="#configparser.ConfigParser.read" title="configparser.ConfigParser.read"><code class="xref py py-meth docutils literal notranslate"><span class="pre">ConfigParser.read()</span></code></a> call with several356files passed to the <em>filenames</em> parameter.</p>357</section>358<section id="supported-datatypes">359<h2>Supported Datatypes<a class="headerlink" href="#supported-datatypes" title="Link to this heading">¶</a></h2>360<p>Config parsers do not guess datatypes of values in configuration files, always361storing them internally as strings.  This means that if you need other362datatypes, you should convert on your own:</p>363<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="nb">int</span><span class="p">(</span><span class="n">topsecret</span><span class="p">[</span><span class="s1">&#39;Port&#39;</span><span class="p">])</span>364<span class="go">50022</span>365<span class="gp">&gt;&gt;&gt; </span><span class="nb">float</span><span class="p">(</span><span class="n">topsecret</span><span class="p">[</span><span class="s1">&#39;CompressionLevel&#39;</span><span class="p">])</span>366<span class="go">9.0</span>367</pre></div>368</div>369<p>Since this task is so common, config parsers provide a range of handy getter370methods to handle integers, floats and booleans.  The last one is the most371interesting because simply passing the value to <code class="docutils literal notranslate"><span class="pre">bool()</span></code> would do no good372since <code class="docutils literal notranslate"><span class="pre">bool('False')</span></code> is still <code class="docutils literal notranslate"><span class="pre">True</span></code>.  This is why config parsers also373provide <a class="reference internal" href="#configparser.ConfigParser.getboolean" title="configparser.ConfigParser.getboolean"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getboolean()</span></code></a>.  This method is case-insensitive and374recognizes Boolean values from <code class="docutils literal notranslate"><span class="pre">'yes'</span></code>/<code class="docutils literal notranslate"><span class="pre">'no'</span></code>, <code class="docutils literal notranslate"><span class="pre">'on'</span></code>/<code class="docutils literal notranslate"><span class="pre">'off'</span></code>,375<code class="docutils literal notranslate"><span class="pre">'true'</span></code>/<code class="docutils literal notranslate"><span class="pre">'false'</span></code> and <code class="docutils literal notranslate"><span class="pre">'1'</span></code>/<code class="docutils literal notranslate"><span class="pre">'0'</span></code> <a class="footnote-reference brackets" href="#id16" id="id3" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>.  For example:</p>376<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;ForwardX11&#39;</span><span class="p">)</span>377<span class="go">False</span>378<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;forge.example&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;ForwardX11&#39;</span><span class="p">)</span>379<span class="go">True</span>380<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;forge.example&#39;</span><span class="p">,</span> <span class="s1">&#39;Compression&#39;</span><span class="p">)</span>381<span class="go">True</span>382</pre></div>383</div>384<p>Apart from <a class="reference internal" href="#configparser.ConfigParser.getboolean" title="configparser.ConfigParser.getboolean"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getboolean()</span></code></a>, config parsers also385provide equivalent <a class="reference internal" href="#configparser.ConfigParser.getint" title="configparser.ConfigParser.getint"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getint()</span></code></a> and386<a class="reference internal" href="#configparser.ConfigParser.getfloat" title="configparser.ConfigParser.getfloat"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getfloat()</span></code></a> methods.  You can register your own387converters and customize the provided ones. <a class="footnote-reference brackets" href="#id16" id="id4" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a></p>388</section>389<section id="fallback-values">390<h2>Fallback Values<a class="headerlink" href="#fallback-values" title="Link to this heading">¶</a></h2>391<p>As with a dictionary, you can use a section’s <a class="reference internal" href="#configparser.ConfigParser.get" title="configparser.ConfigParser.get"><code class="xref py py-meth docutils literal notranslate"><span class="pre">get()</span></code></a> method to392provide fallback values:</p>393<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Port&#39;</span><span class="p">)</span>394<span class="go">&#39;50022&#39;</span>395<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;CompressionLevel&#39;</span><span class="p">)</span>396<span class="go">&#39;9&#39;</span>397<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Cipher&#39;</span><span class="p">)</span>398<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Cipher&#39;</span><span class="p">,</span> <span class="s1">&#39;3des-cbc&#39;</span><span class="p">)</span>399<span class="go">&#39;3des-cbc&#39;</span>400</pre></div>401</div>402<p>Please note that default values have precedence over fallback values.403For instance, in our example the <code class="docutils literal notranslate"><span class="pre">'CompressionLevel'</span></code> key was404specified only in the <code class="docutils literal notranslate"><span class="pre">'DEFAULT'</span></code> section.  If we try to get it from405the section <code class="docutils literal notranslate"><span class="pre">'topsecret.server.example'</span></code>, we will always get the default,406even if we specify a fallback:</p>407<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;CompressionLevel&#39;</span><span class="p">,</span> <span class="s1">&#39;3&#39;</span><span class="p">)</span>408<span class="go">&#39;9&#39;</span>409</pre></div>410</div>411<p>One more thing to be aware of is that the parser-level <a class="reference internal" href="#configparser.ConfigParser.get" title="configparser.ConfigParser.get"><code class="xref py py-meth docutils literal notranslate"><span class="pre">get()</span></code></a> method412provides a custom, more complex interface, maintained for backwards413compatibility.  When using this method, a fallback value can be provided via414the <code class="docutils literal notranslate"><span class="pre">fallback</span></code> keyword-only argument:</p>415<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;forge.example&#39;</span><span class="p">,</span> <span class="s1">&#39;monster&#39;</span><span class="p">,</span>416<span class="gp">... </span>           <span class="n">fallback</span><span class="o">=</span><span class="s1">&#39;No such things as monsters&#39;</span><span class="p">)</span>417<span class="go">&#39;No such things as monsters&#39;</span>418</pre></div>419</div>420<p>The same <code class="docutils literal notranslate"><span class="pre">fallback</span></code> argument can be used with the421<a class="reference internal" href="#configparser.ConfigParser.getint" title="configparser.ConfigParser.getint"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getint()</span></code></a>, <a class="reference internal" href="#configparser.ConfigParser.getfloat" title="configparser.ConfigParser.getfloat"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getfloat()</span></code></a> and422<a class="reference internal" href="#configparser.ConfigParser.getboolean" title="configparser.ConfigParser.getboolean"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getboolean()</span></code></a> methods, for example:</p>423<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="s1">&#39;BatchMode&#39;</span> <span class="ow">in</span> <span class="n">topsecret</span>424<span class="go">False</span>425<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;BatchMode&#39;</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>426<span class="go">True</span>427<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">][</span><span class="s1">&#39;BatchMode&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;no&#39;</span>428<span class="gp">&gt;&gt;&gt; </span><span class="n">topsecret</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;BatchMode&#39;</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>429<span class="go">False</span>430</pre></div>431</div>432</section>433<section id="supported-ini-file-structure">434<h2>Supported INI File Structure<a class="headerlink" href="#supported-ini-file-structure" title="Link to this heading">¶</a></h2>435<p>A configuration file consists of sections, each led by a <code class="docutils literal notranslate"><span class="pre">[section]</span></code> header,436followed by key/value entries separated by a specific string (<code class="docutils literal notranslate"><span class="pre">=</span></code> or <code class="docutils literal notranslate"><span class="pre">:</span></code> by437default <a class="footnote-reference brackets" href="#id16" id="id5" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>).  By default, section names are case sensitive but keys are not438<a class="footnote-reference brackets" href="#id16" id="id6" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>.  Leading and trailing whitespace is removed from keys and values.439Values can be omitted if the parser is configured to allow it <a class="footnote-reference brackets" href="#id16" id="id7" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>,440in which case the key/value delimiter may also be left441out.  Values can also span multiple lines, as long as they are indented deeper442than the first line of the value.  Depending on the parser’s mode, blank lines443may be treated as parts of multiline values or ignored.</p>444<p>By default, a valid section name can be any string that does not contain ‘\n’.445To change this, see <a class="reference internal" href="#configparser.ConfigParser.SECTCRE" title="configparser.ConfigParser.SECTCRE"><code class="xref py py-attr docutils literal notranslate"><span class="pre">ConfigParser.SECTCRE</span></code></a>.</p>446<p>The first section name may be omitted if the parser is configured to allow an447unnamed top level section with <code class="docutils literal notranslate"><span class="pre">allow_unnamed_section=True</span></code>. In this case,448the keys/values may be retrieved by <a class="reference internal" href="#configparser.UNNAMED_SECTION" title="configparser.UNNAMED_SECTION"><code class="xref py py-const docutils literal notranslate"><span class="pre">UNNAMED_SECTION</span></code></a> as in449<code class="docutils literal notranslate"><span class="pre">config[UNNAMED_SECTION]</span></code>.</p>450<p>Configuration files may include comments, prefixed by specific451characters (<code class="docutils literal notranslate"><span class="pre">#</span></code> and <code class="docutils literal notranslate"><span class="pre">;</span></code> by default <a class="footnote-reference brackets" href="#id16" id="id8" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>).  Comments may appear on452their own on an otherwise empty line, possibly indented. <a class="footnote-reference brackets" href="#id16" id="id9" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a></p>453<p>For example:</p>454<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[Simple Values]</span>455<span class="na">key</span><span class="o">=</span><span class="s">value</span>456<span class="na">spaces in keys</span><span class="o">=</span><span class="s">allowed</span>457<span class="na">spaces in values</span><span class="o">=</span><span class="s">allowed as well</span>458<span class="na">spaces around the delimiter</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">obviously</span>459<span class="na">you can also use</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="s">to delimit keys from values</span>460 461<span class="k">[All Values Are Strings]</span>462<span class="na">values like this</span><span class="o">:</span><span class="w"> </span><span class="s">1000000</span>463<span class="na">or this</span><span class="o">:</span><span class="w"> </span><span class="s">3.14159265359</span>464<span class="na">are they treated as numbers?</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="s">no</span>465<span class="na">integers, floats and booleans are held as</span><span class="o">:</span><span class="w"> </span><span class="s">strings</span>466<span class="na">can use the API to get converted values directly</span><span class="o">:</span><span class="w"> </span><span class="s">true</span>467 468<span class="k">[Multiline Values]</span>469<span class="na">chorus</span><span class="o">:</span><span class="w"> </span><span class="s">I&#39;m a lumberjack, and I&#39;m okay</span>470<span class="w">    </span><span class="na">I sleep all night and I work all day</span>471 472<span class="k">[No Values]</span>473<span class="na">key_without_value</span>474<span class="na">empty string value here</span><span class="w"> </span><span class="o">=</span>475 476<span class="k">[You can use comments]</span>477<span class="c1"># like this</span>478<span class="c1">; or this</span>479 480<span class="c1"># By default only in an empty line.</span>481<span class="c1"># Inline comments can be harmful because they prevent users</span>482<span class="c1"># from using the delimiting characters as parts of values.</span>483<span class="c1"># That being said, this can be customized.</span>484 485<span class="w">    </span><span class="k">[Sections Can Be Indented]</span>486<span class="w">        </span><span class="na">can_values_be_as_well</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">True</span>487<span class="w">        </span><span class="na">does_that_mean_anything_special</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">False</span>488<span class="w">        </span><span class="na">purpose</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">formatting for readability</span>489<span class="w">        </span><span class="na">multiline_values</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">are</span>490<span class="w">            </span><span class="na">handled just fine as</span>491<span class="w">            </span><span class="na">long as they are indented</span>492<span class="w">            </span><span class="na">deeper than the first line</span>493<span class="w">            </span><span class="na">of a value</span>494<span class="w">        </span><span class="c1"># Did I mention we can indent comments, too?</span>495</pre></div>496</div>497</section>498<section id="unnamed-sections">499<span id="id10"></span><h2>Unnamed Sections<a class="headerlink" href="#unnamed-sections" title="Link to this heading">¶</a></h2>500<p>The name of the first section (or unique) may be omitted and values501retrieved by the <a class="reference internal" href="#configparser.UNNAMED_SECTION" title="configparser.UNNAMED_SECTION"><code class="xref py py-const docutils literal notranslate"><span class="pre">UNNAMED_SECTION</span></code></a> attribute.</p>502<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">config</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>503<span class="gp">... </span><span class="s2">option = value</span>504<span class="gp">...</span>505<span class="gp">... </span><span class="s2">[  Section 2  ]</span>506<span class="gp">... </span><span class="s2">another = val</span>507<span class="gp">... </span><span class="s2">&quot;&quot;&quot;</span>508<span class="gp">&gt;&gt;&gt; </span><span class="n">unnamed</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">(</span><span class="n">allow_unnamed_section</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>509<span class="gp">&gt;&gt;&gt; </span><span class="n">unnamed</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>510<span class="gp">&gt;&gt;&gt; </span><span class="n">unnamed</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">configparser</span><span class="o">.</span><span class="n">UNNAMED_SECTION</span><span class="p">,</span> <span class="s1">&#39;option&#39;</span><span class="p">)</span>511<span class="go">&#39;value&#39;</span>512</pre></div>513</div>514</section>515<section id="interpolation-of-values">516<h2>Interpolation of values<a class="headerlink" href="#interpolation-of-values" title="Link to this heading">¶</a></h2>517<p>On top of the core functionality, <a class="reference internal" href="#configparser.ConfigParser" title="configparser.ConfigParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConfigParser</span></code></a> supports518interpolation.  This means values can be preprocessed before returning them519from <code class="docutils literal notranslate"><span class="pre">get()</span></code> calls.</p>520<dl class="py class" id="index-1">521<dt class="sig sig-object py" id="configparser.BasicInterpolation">522<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">configparser.</span></span><span class="sig-name descname"><span class="pre">BasicInterpolation</span></span><a class="headerlink" href="#configparser.BasicInterpolation" title="Link to this definition">¶</a></dt>523<dd><p>The default implementation used by <a class="reference internal" href="#configparser.ConfigParser" title="configparser.ConfigParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConfigParser</span></code></a>.  It enables524values to contain format strings which refer to other values in the same525section, or values in the special default section <a class="footnote-reference brackets" href="#id16" id="id11" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>.  Additional default526values can be provided on initialization.</p>527<p>For example:</p>528<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[Paths]</span>529<span class="na">home_dir</span><span class="o">:</span><span class="w"> </span><span class="s">/Users</span>530<span class="na">my_dir</span><span class="o">:</span><span class="w"> </span><span class="s">%(home_dir)s/lumberjack</span>531<span class="na">my_pictures</span><span class="o">:</span><span class="w"> </span><span class="s">%(my_dir)s/Pictures</span>532 533<span class="k">[Escape]</span>534<span class="c1"># use a %% to escape the % sign (% is the only character that needs to be escaped):</span>535<span class="na">gain</span><span class="o">:</span><span class="w"> </span><span class="s">80%%</span>536</pre></div>537</div>538<p>In the example above, <a class="reference internal" href="#configparser.ConfigParser" title="configparser.ConfigParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConfigParser</span></code></a> with <em>interpolation</em> set to539<code class="docutils literal notranslate"><span class="pre">BasicInterpolation()</span></code> would resolve <code class="docutils literal notranslate"><span class="pre">%(home_dir)s</span></code> to the value of540<code class="docutils literal notranslate"><span class="pre">home_dir</span></code> (<code class="docutils literal notranslate"><span class="pre">/Users</span></code> in this case).  <code class="docutils literal notranslate"><span class="pre">%(my_dir)s</span></code> in effect would541resolve to <code class="docutils literal notranslate"><span class="pre">/Users/lumberjack</span></code>.  All interpolations are done on demand so542keys used in the chain of references do not have to be specified in any543specific order in the configuration file.</p>544<p>With <code class="docutils literal notranslate"><span class="pre">interpolation</span></code> set to <code class="docutils literal notranslate"><span class="pre">None</span></code>, the parser would simply return545<code class="docutils literal notranslate"><span class="pre">%(my_dir)s/Pictures</span></code> as the value of <code class="docutils literal notranslate"><span class="pre">my_pictures</span></code> and546<code class="docutils literal notranslate"><span class="pre">%(home_dir)s/lumberjack</span></code> as the value of <code class="docutils literal notranslate"><span class="pre">my_dir</span></code>.</p>547</dd></dl>548 549<dl class="py class" id="index-2">550<dt class="sig sig-object py" id="configparser.ExtendedInterpolation">551<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">configparser.</span></span><span class="sig-name descname"><span class="pre">ExtendedInterpolation</span></span><a class="headerlink" href="#configparser.ExtendedInterpolation" title="Link to this definition">¶</a></dt>552<dd><p>An alternative handler for interpolation which implements a more advanced553syntax, used for instance in <code class="docutils literal notranslate"><span class="pre">zc.buildout</span></code>.  Extended interpolation is554using <code class="docutils literal notranslate"><span class="pre">${section:option}</span></code> to denote a value from a foreign section.555Interpolation can span multiple levels.  For convenience, if the556<code class="docutils literal notranslate"><span class="pre">section:</span></code> part is omitted, interpolation defaults to the current section557(and possibly the default values from the special section).</p>558<p>For example, the configuration specified above with basic interpolation,559would look like this with extended interpolation:</p>560<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[Paths]</span>561<span class="na">home_dir</span><span class="o">:</span><span class="w"> </span><span class="s">/Users</span>562<span class="na">my_dir</span><span class="o">:</span><span class="w"> </span><span class="s">${home_dir}/lumberjack</span>563<span class="na">my_pictures</span><span class="o">:</span><span class="w"> </span><span class="s">${my_dir}/Pictures</span>564 565<span class="k">[Escape]</span>566<span class="c1"># use a $$ to escape the $ sign ($ is the only character that needs to be escaped):</span>567<span class="na">cost</span><span class="o">:</span><span class="w"> </span><span class="s">$$80</span>568</pre></div>569</div>570<p>Values from other sections can be fetched as well:</p>571<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[Common]</span>572<span class="na">home_dir</span><span class="o">:</span><span class="w"> </span><span class="s">/Users</span>573<span class="na">library_dir</span><span class="o">:</span><span class="w"> </span><span class="s">/Library</span>574<span class="na">system_dir</span><span class="o">:</span><span class="w"> </span><span class="s">/System</span>575<span class="na">macports_dir</span><span class="o">:</span><span class="w"> </span><span class="s">/opt/local</span>576 577<span class="k">[Frameworks]</span>578<span class="na">Python</span><span class="o">:</span><span class="w"> </span><span class="s">3.2</span>579<span class="na">path</span><span class="o">:</span><span class="w"> </span><span class="s">${Common:system_dir}/Library/Frameworks/</span>580 581<span class="k">[Arthur]</span>582<span class="na">nickname</span><span class="o">:</span><span class="w"> </span><span class="s">Two Sheds</span>583<span class="na">last_name</span><span class="o">:</span><span class="w"> </span><span class="s">Jackson</span>584<span class="na">my_dir</span><span class="o">:</span><span class="w"> </span><span class="s">${Common:home_dir}/twosheds</span>585<span class="na">my_pictures</span><span class="o">:</span><span class="w"> </span><span class="s">${my_dir}/Pictures</span>586<span class="na">python_dir</span><span class="o">:</span><span class="w"> </span><span class="s">${Frameworks:path}/Python/Versions/${Frameworks:Python}</span>587</pre></div>588</div>589</dd></dl>590 591</section>592<section id="mapping-protocol-access">593<h2>Mapping Protocol Access<a class="headerlink" href="#mapping-protocol-access" title="Link to this heading">¶</a></h2>594<div class="versionadded">595<p><span class="versionmodified added">Added in version 3.2.</span></p>596</div>597<p>Mapping protocol access is a generic name for functionality that enables using598custom objects as if they were dictionaries.  In case of <code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code>,599the mapping interface implementation is using the600<code class="docutils literal notranslate"><span class="pre">parser['section']['option']</span></code> notation.</p>601<p><code class="docutils literal notranslate"><span class="pre">parser['section']</span></code> in particular returns a proxy for the section’s data in602the parser.  This means that the values are not copied but they are taken from603the original parser on demand.  What’s even more important is that when values604are changed on a section proxy, they are actually mutated in the original605parser.</p>606<p><code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code> objects behave as close to actual dictionaries as possible.607The mapping interface is complete and adheres to the608<a class="reference internal" href="collections.abc.html#collections.abc.MutableMapping" title="collections.abc.MutableMapping"><code class="xref py py-class docutils literal notranslate"><span class="pre">MutableMapping</span></code></a> ABC.609However, there are a few differences that should be taken into account:</p>610<ul>611<li><p>By default, all keys in sections are accessible in a case-insensitive manner612<a class="footnote-reference brackets" href="#id16" id="id12" role="doc-noteref"><span class="fn-bracket">[</span>1<span class="fn-bracket">]</span></a>.  E.g. <code class="docutils literal notranslate"><span class="pre">for</span> <span class="pre">option</span> <span class="pre">in</span> <span class="pre">parser[&quot;section&quot;]</span></code> yields only <code class="docutils literal notranslate"><span class="pre">optionxform</span></code>’ed613option key names.  This means lowercased keys by default.  At the same time,614for a section that holds the key <code class="docutils literal notranslate"><span class="pre">'a'</span></code>, both expressions return <code class="docutils literal notranslate"><span class="pre">True</span></code>:</p>615<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="s2">&quot;a&quot;</span> <span class="ow">in</span> <span class="n">parser</span><span class="p">[</span><span class="s2">&quot;section&quot;</span><span class="p">]</span>616<span class="s2">&quot;A&quot;</span> <span class="ow">in</span> <span class="n">parser</span><span class="p">[</span><span class="s2">&quot;section&quot;</span><span class="p">]</span>617</pre></div>618</div>619</li>620<li><p>All sections include <code class="docutils literal notranslate"><span class="pre">DEFAULTSECT</span></code> values as well which means that621<code class="docutils literal notranslate"><span class="pre">.clear()</span></code> on a section may not leave the section visibly empty.  This is622because default values cannot be deleted from the section (because technically623they are not there).  If they are overridden in the section, deleting causes624the default value to be visible again.  Trying to delete a default value625causes a <a class="reference internal" href="exceptions.html#KeyError" title="KeyError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">KeyError</span></code></a>.</p></li>626<li><p><code class="docutils literal notranslate"><span class="pre">DEFAULTSECT</span></code> cannot be removed from the parser:</p>627<ul class="simple">628<li><p>trying to delete it raises <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a>,</p></li>629<li><p><code class="docutils literal notranslate"><span class="pre">parser.clear()</span></code> leaves it intact,</p></li>630<li><p><code class="docutils literal notranslate"><span class="pre">parser.popitem()</span></code> never returns it.</p></li>631</ul>632</li>633<li><p><code class="docutils literal notranslate"><span class="pre">parser.get(section,</span> <span class="pre">option,</span> <span class="pre">**kwargs)</span></code> - the second argument is <strong>not</strong>634a fallback value.  Note however that the section-level <code class="docutils literal notranslate"><span class="pre">get()</span></code> methods are635compatible both with the mapping protocol and the classic configparser API.</p></li>636<li><p><code class="docutils literal notranslate"><span class="pre">parser.items()</span></code> is compatible with the mapping protocol (returns a list of637<em>section_name</em>, <em>section_proxy</em> pairs including the DEFAULTSECT).  However,638this method can also be invoked with arguments: <code class="docutils literal notranslate"><span class="pre">parser.items(section,</span> <span class="pre">raw,</span>639<span class="pre">vars)</span></code>.  The latter call returns a list of <em>option</em>, <em>value</em> pairs for640a specified <code class="docutils literal notranslate"><span class="pre">section</span></code>, with all interpolations expanded (unless641<code class="docutils literal notranslate"><span class="pre">raw=True</span></code> is provided).</p></li>642</ul>643<p>The mapping protocol is implemented on top of the existing legacy API so that644subclasses overriding the original interface still should have mappings working645as expected.</p>646</section>647<section id="customizing-parser-behaviour">648<h2>Customizing Parser Behaviour<a class="headerlink" href="#customizing-parser-behaviour" title="Link to this heading">¶</a></h2>649<p>There are nearly as many INI format variants as there are applications using it.650<code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code> goes a long way to provide support for the largest sensible651set of INI styles available.  The default functionality is mainly dictated by652historical background and it’s very likely that you will want to customize some653of the features.</p>654<p>The most common way to change the way a specific config parser works is to use655the <code class="xref py py-meth docutils literal notranslate"><span class="pre">__init__()</span></code> options:</p>656<ul>657<li><p><em>defaults</em>, default value: <code class="docutils literal notranslate"><span class="pre">None</span></code></p>658<p>This option accepts a dictionary of key-value pairs which will be initially659put in the <code class="docutils literal notranslate"><span class="pre">DEFAULT</span></code> section.  This makes for an elegant way to support660concise configuration files that don’t specify values which are the same as661the documented default.</p>662<p>Hint: if you want to specify default values for a specific section, use663<a class="reference internal" href="#configparser.ConfigParser.read_dict" title="configparser.ConfigParser.read_dict"><code class="xref py py-meth docutils literal notranslate"><span class="pre">read_dict()</span></code></a> before you read the actual file.</p>664</li>665<li><p><em>dict_type</em>, default value: <a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal notranslate"><span class="pre">dict</span></code></a></p>666<p>This option has a major impact on how the mapping protocol will behave and how667the written configuration files look.  With the standard dictionary, every668section is stored in the order they were added to the parser.  Same goes for669options within sections.</p>670<p>An alternative dictionary type can be used for example to sort sections and671options on write-back.</p>672<p>Please note: there are ways to add a set of key-value pairs in a single673operation.  When you use a regular dictionary in those operations, the order674of the keys will be ordered.  For example:</p>675<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">parser</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>676<span class="gp">&gt;&gt;&gt; </span><span class="n">parser</span><span class="o">.</span><span class="n">read_dict</span><span class="p">({</span><span class="s1">&#39;section1&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;key1&#39;</span><span class="p">:</span> <span class="s1">&#39;value1&#39;</span><span class="p">,</span>677<span class="gp">... </span>                               <span class="s1">&#39;key2&#39;</span><span class="p">:</span> <span class="s1">&#39;value2&#39;</span><span class="p">,</span>678<span class="gp">... </span>                               <span class="s1">&#39;key3&#39;</span><span class="p">:</span> <span class="s1">&#39;value3&#39;</span><span class="p">},</span>679<span class="gp">... </span>                  <span class="s1">&#39;section2&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;keyA&#39;</span><span class="p">:</span> <span class="s1">&#39;valueA&#39;</span><span class="p">,</span>680<span class="gp">... </span>                               <span class="s1">&#39;keyB&#39;</span><span class="p">:</span> <span class="s1">&#39;valueB&#39;</span><span class="p">,</span>681<span class="gp">... </span>                               <span class="s1">&#39;keyC&#39;</span><span class="p">:</span> <span class="s1">&#39;valueC&#39;</span><span class="p">},</span>682<span class="gp">... </span>                  <span class="s1">&#39;section3&#39;</span><span class="p">:</span> <span class="p">{</span><span class="s1">&#39;foo&#39;</span><span class="p">:</span> <span class="s1">&#39;x&#39;</span><span class="p">,</span>683<span class="gp">... </span>                               <span class="s1">&#39;bar&#39;</span><span class="p">:</span> <span class="s1">&#39;y&#39;</span><span class="p">,</span>684<span class="gp">... </span>                               <span class="s1">&#39;baz&#39;</span><span class="p">:</span> <span class="s1">&#39;z&#39;</span><span class="p">}</span>685<span class="gp">... </span><span class="p">})</span>686<span class="gp">&gt;&gt;&gt; </span><span class="n">parser</span><span class="o">.</span><span class="n">sections</span><span class="p">()</span>687<span class="go">[&#39;section1&#39;, &#39;section2&#39;, &#39;section3&#39;]</span>688<span class="gp">&gt;&gt;&gt; </span><span class="p">[</span><span class="n">option</span> <span class="k">for</span> <span class="n">option</span> <span class="ow">in</span> <span class="n">parser</span><span class="p">[</span><span class="s1">&#39;section3&#39;</span><span class="p">]]</span>689<span class="go">[&#39;foo&#39;, &#39;bar&#39;, &#39;baz&#39;]</span>690</pre></div>691</div>692</li>693<li><p><em>allow_no_value</em>, default value: <code class="docutils literal notranslate"><span class="pre">False</span></code></p>694<p>Some configuration files are known to include settings without values, but695which otherwise conform to the syntax supported by <code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code>.  The696<em>allow_no_value</em> parameter to the constructor can be used to697indicate that such values should be accepted:</p>698<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span><span class="w"> </span><span class="nn">configparser</span>699 700<span class="gp">&gt;&gt;&gt; </span><span class="n">sample_config</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>701<span class="gp">... </span><span class="s2">[mysqld]</span>702<span class="gp">... </span><span class="s2">  user = mysql</span>703<span class="gp">... </span><span class="s2">  pid-file = /var/run/mysqld/mysqld.pid</span>704<span class="gp">... </span><span class="s2">  skip-external-locking</span>705<span class="gp">... </span><span class="s2">  old_passwords = 1</span>706<span class="gp">... </span><span class="s2">  skip-bdb</span>707<span class="gp">... </span><span class="s2">  # we don&#39;t need ACID today</span>708<span class="gp">... </span><span class="s2">  skip-innodb</span>709<span class="gp">... </span><span class="s2">&quot;&quot;&quot;</span>710<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">(</span><span class="n">allow_no_value</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>711<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">sample_config</span><span class="p">)</span>712 713<span class="gp">&gt;&gt;&gt; </span><span class="c1"># Settings with values are treated as before:</span>714<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s2">&quot;mysqld&quot;</span><span class="p">][</span><span class="s2">&quot;user&quot;</span><span class="p">]</span>715<span class="go">&#39;mysql&#39;</span>716 717<span class="gp">&gt;&gt;&gt; </span><span class="c1"># Settings without values provide None:</span>718<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s2">&quot;mysqld&quot;</span><span class="p">][</span><span class="s2">&quot;skip-bdb&quot;</span><span class="p">]</span>719 720<span class="gp">&gt;&gt;&gt; </span><span class="c1"># Settings which aren&#39;t specified still raise an error:</span>721<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span><span class="p">[</span><span class="s2">&quot;mysqld&quot;</span><span class="p">][</span><span class="s2">&quot;does-not-exist&quot;</span><span class="p">]</span>722<span class="gt">Traceback (most recent call last):</span>723<span class="w">  </span><span class="c">...</span>724<span class="gr">KeyError</span>: <span class="n">&#39;does-not-exist&#39;</span>725</pre></div>726</div>727</li>728<li><p><em>delimiters</em>, default value: <code class="docutils literal notranslate"><span class="pre">('=',</span> <span class="pre">':')</span></code></p>729<p>Delimiters are substrings that delimit keys from values within a section.730The first occurrence of a delimiting substring on a line is considered731a delimiter.  This means values (but not keys) can contain the delimiters.</p>732<p>See also the <em>space_around_delimiters</em> argument to733<a class="reference internal" href="#configparser.ConfigParser.write" title="configparser.ConfigParser.write"><code class="xref py py-meth docutils literal notranslate"><span class="pre">ConfigParser.write()</span></code></a>.</p>734</li>735<li><p><em>comment_prefixes</em>, default value: <code class="docutils literal notranslate"><span class="pre">('#',</span> <span class="pre">';')</span></code></p></li>736<li><p><em>inline_comment_prefixes</em>, default value: <code class="docutils literal notranslate"><span class="pre">None</span></code></p>737<p>Comment prefixes are strings that indicate the start of a valid comment within738a config file. <em>comment_prefixes</em> are used only on otherwise empty lines739(optionally indented) whereas <em>inline_comment_prefixes</em> can be used after740every valid value (e.g. section names, options and empty lines as well).  By741default inline comments are disabled and <code class="docutils literal notranslate"><span class="pre">'#'</span></code> and <code class="docutils literal notranslate"><span class="pre">';'</span></code> are used as742prefixes for whole line comments.</p>743<div class="versionchanged">744<p><span class="versionmodified changed">Changed in version 3.2: </span>In previous versions of <code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code> behaviour matched745<code class="docutils literal notranslate"><span class="pre">comment_prefixes=('#',';')</span></code> and <code class="docutils literal notranslate"><span class="pre">inline_comment_prefixes=(';',)</span></code>.</p>746</div>747<p>Please note that config parsers don’t support escaping of comment prefixes so748using <em>inline_comment_prefixes</em> may prevent users from specifying option749values with characters used as comment prefixes.  When in doubt, avoid750setting <em>inline_comment_prefixes</em>.  In any circumstances, the only way of751storing comment prefix characters at the beginning of a line in multiline752values is to interpolate the prefix, for example:</p>753<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span><span class="w"> </span><span class="nn">configparser</span><span class="w"> </span><span class="kn">import</span> <span class="n">ConfigParser</span><span class="p">,</span> <span class="n">ExtendedInterpolation</span>754<span class="gp">&gt;&gt;&gt; </span><span class="n">parser</span> <span class="o">=</span> <span class="n">ConfigParser</span><span class="p">(</span><span class="n">interpolation</span><span class="o">=</span><span class="n">ExtendedInterpolation</span><span class="p">())</span>755<span class="gp">&gt;&gt;&gt; </span><span class="c1"># the default BasicInterpolation could be used as well</span>756<span class="gp">&gt;&gt;&gt; </span><span class="n">parser</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="s2">&quot;&quot;&quot;</span>757<span class="gp">... </span><span class="s2">[DEFAULT]</span>758<span class="gp">... </span><span class="s2">hash = #</span>759<span class="gp">...</span>760<span class="gp">... </span><span class="s2">[hashes]</span>761<span class="gp">... </span><span class="s2">shebang =</span>762<span class="gp">... </span><span class="s2">  $</span><span class="si">{hash}</span><span class="s2">!/usr/bin/env python</span>763<span class="gp">... </span><span class="s2">  $</span><span class="si">{hash}</span><span class="s2"> -*- coding: utf-8 -*-</span>764<span class="gp">...</span>765<span class="gp">... </span><span class="s2">extensions =</span>766<span class="gp">... </span><span class="s2">  enabled_extension</span>767<span class="gp">... </span><span class="s2">  another_extension</span>768<span class="gp">... </span><span class="s2">  #disabled_by_comment</span>769<span class="gp">... </span><span class="s2">  yet_another_extension</span>770<span class="gp">...</span>771<span class="gp">... </span><span class="s2">interpolation not necessary = if # is not at line start</span>772<span class="gp">... </span><span class="s2">even in multiline values = line #1</span>773<span class="gp">... </span><span class="s2">  line #2</span>774<span class="gp">... </span><span class="s2">  line #3</span>775<span class="gp">... </span><span class="s2">&quot;&quot;&quot;</span><span class="p">)</span>776<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">parser</span><span class="p">[</span><span class="s1">&#39;hashes&#39;</span><span class="p">][</span><span class="s1">&#39;shebang&#39;</span><span class="p">])</span>777 778<span class="go">#!/usr/bin/env python</span>779<span class="go"># -*- coding: utf-8 -*-</span>780<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">parser</span><span class="p">[</span><span class="s1">&#39;hashes&#39;</span><span class="p">][</span><span class="s1">&#39;extensions&#39;</span><span class="p">])</span>781 782<span class="go">enabled_extension</span>783<span class="go">another_extension</span>784<span class="go">yet_another_extension</span>785<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">parser</span><span class="p">[</span><span class="s1">&#39;hashes&#39;</span><span class="p">][</span><span class="s1">&#39;interpolation not necessary&#39;</span><span class="p">])</span>786<span class="go">if # is not at line start</span>787<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">parser</span><span class="p">[</span><span class="s1">&#39;hashes&#39;</span><span class="p">][</span><span class="s1">&#39;even in multiline values&#39;</span><span class="p">])</span>788<span class="go">line #1</span>789<span class="go">line #2</span>790<span class="go">line #3</span>791</pre></div>792</div>793</li>794<li><p><em>strict</em>, default value: <code class="docutils literal notranslate"><span class="pre">True</span></code></p>795<p>When set to <code class="docutils literal notranslate"><span class="pre">True</span></code>, the parser will not allow for any section or option796duplicates while reading from a single source (using <a class="reference internal" href="#configparser.ConfigParser.read_file" title="configparser.ConfigParser.read_file"><code class="xref py py-meth docutils literal notranslate"><span class="pre">read_file()</span></code></a>,797<a class="reference internal" href="#configparser.ConfigParser.read_string" title="configparser.ConfigParser.read_string"><code class="xref py py-meth docutils literal notranslate"><span class="pre">read_string()</span></code></a> or <a class="reference internal" href="#configparser.ConfigParser.read_dict" title="configparser.ConfigParser.read_dict"><code class="xref py py-meth docutils literal notranslate"><span class="pre">read_dict()</span></code></a>).  It is recommended to use strict798parsers in new applications.</p>799<div class="versionchanged">800<p><span class="versionmodified changed">Changed in version 3.2: </span>In previous versions of <code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code> behaviour matched801<code class="docutils literal notranslate"><span class="pre">strict=False</span></code>.</p>802</div>803</li>804<li><p><em>empty_lines_in_values</em>, default value: <code class="docutils literal notranslate"><span class="pre">True</span></code></p>805<p>In config parsers, values can span multiple lines as long as they are806indented more than the key that holds them.  By default parsers also let807empty lines to be parts of values.  At the same time, keys can be arbitrarily808indented themselves to improve readability.  In consequence, when809configuration files get big and complex, it is easy for the user to lose810track of the file structure.  Take for instance:</p>811<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[Section]</span>812<span class="na">key</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">multiline</span>813<span class="w">  </span><span class="na">value with a gotcha</span>814 815<span class="w"> </span><span class="na">this</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">is still a part of the multiline value of &#39;key&#39;</span>816</pre></div>817</div>818<p>This can be especially problematic for the user to see if she’s using a819proportional font to edit the file.  That is why when your application does820not need values with empty lines, you should consider disallowing them.  This821will make empty lines split keys every time.  In the example above, it would822produce two keys, <code class="docutils literal notranslate"><span class="pre">key</span></code> and <code class="docutils literal notranslate"><span class="pre">this</span></code>.</p>823</li>824<li><p><em>default_section</em>, default value: <code class="docutils literal notranslate"><span class="pre">configparser.DEFAULTSECT</span></code> (that is:825<code class="docutils literal notranslate"><span class="pre">&quot;DEFAULT&quot;</span></code>)</p>826<p>The convention of allowing a special section of default values for other827sections or interpolation purposes is a powerful concept of this library,828letting users create complex declarative configurations.  This section is829normally called <code class="docutils literal notranslate"><span class="pre">&quot;DEFAULT&quot;</span></code> but this can be customized to point to any830other valid section name.  Some typical values include: <code class="docutils literal notranslate"><span class="pre">&quot;general&quot;</span></code> or831<code class="docutils literal notranslate"><span class="pre">&quot;common&quot;</span></code>.  The name provided is used for recognizing default sections832when reading from any source and is used when writing configuration back to833a file.  Its current value can be retrieved using the834<code class="docutils literal notranslate"><span class="pre">parser_instance.default_section</span></code> attribute and may be modified at runtime835(i.e. to convert files from one format to another).</p>836</li>837<li><p><em>interpolation</em>, default value: <code class="docutils literal notranslate"><span class="pre">configparser.BasicInterpolation</span></code></p>838<p>Interpolation behaviour may be customized by providing a custom handler839through the <em>interpolation</em> argument. <code class="docutils literal notranslate"><span class="pre">None</span></code> can be used to turn off840interpolation completely, <code class="docutils literal notranslate"><span class="pre">ExtendedInterpolation()</span></code> provides a more841advanced variant inspired by <code class="docutils literal notranslate"><span class="pre">zc.buildout</span></code>.  More on the subject in the842<a class="reference external" href="#interpolation-of-values">dedicated documentation section</a>.843<a class="reference internal" href="#configparser.RawConfigParser" title="configparser.RawConfigParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">RawConfigParser</span></code></a> has a default value of <code class="docutils literal notranslate"><span class="pre">None</span></code>.</p>844</li>845<li><p><em>converters</em>, default value: not set</p>846<p>Config parsers provide option value getters that perform type conversion.  By847default <a class="reference internal" href="#configparser.ConfigParser.getint" title="configparser.ConfigParser.getint"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getint()</span></code></a>, <a class="reference internal" href="#configparser.ConfigParser.getfloat" title="configparser.ConfigParser.getfloat"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getfloat()</span></code></a>, and848<a class="reference internal" href="#configparser.ConfigParser.getboolean" title="configparser.ConfigParser.getboolean"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getboolean()</span></code></a> are implemented.  Should other getters be849desirable, users may define them in a subclass or pass a dictionary where each850key is a name of the converter and each value is a callable implementing said851conversion.  For instance, passing <code class="docutils literal notranslate"><span class="pre">{'decimal':</span> <span class="pre">decimal.Decimal}</span></code> would add852<code class="xref py py-meth docutils literal notranslate"><span class="pre">getdecimal()</span></code> on both the parser object and all section proxies.  In853other words, it will be possible to write both854<code class="docutils literal notranslate"><span class="pre">parser_instance.getdecimal('section',</span> <span class="pre">'key',</span> <span class="pre">fallback=0)</span></code> and855<code class="docutils literal notranslate"><span class="pre">parser_instance['section'].getdecimal('key',</span> <span class="pre">0)</span></code>.</p>856<p>If the converter needs to access the state of the parser, it can be857implemented as a method on a config parser subclass.  If the name of this858method starts with <code class="docutils literal notranslate"><span class="pre">get</span></code>, it will be available on all section proxies, in859the dict-compatible form (see the <code class="docutils literal notranslate"><span class="pre">getdecimal()</span></code> example above).</p>860</li>861</ul>862<p>More advanced customization may be achieved by overriding default values of863these parser attributes.  The defaults are defined on the classes, so they may864be overridden by subclasses or by attribute assignment.</p>865<dl class="py attribute">866<dt class="sig sig-object py" id="configparser.ConfigParser.BOOLEAN_STATES">867<span class="sig-prename descclassname"><span class="pre">ConfigParser.</span></span><span class="sig-name descname"><span class="pre">BOOLEAN_STATES</span></span><a class="headerlink" href="#configparser.ConfigParser.BOOLEAN_STATES" title="Link to this definition">¶</a></dt>868<dd><p>By default when using <a class="reference internal" href="#configparser.ConfigParser.getboolean" title="configparser.ConfigParser.getboolean"><code class="xref py py-meth docutils literal notranslate"><span class="pre">getboolean()</span></code></a>, config parsers869consider the following values <code class="docutils literal notranslate"><span class="pre">True</span></code>: <code class="docutils literal notranslate"><span class="pre">'1'</span></code>, <code class="docutils literal notranslate"><span class="pre">'yes'</span></code>, <code class="docutils literal notranslate"><span class="pre">'true'</span></code>,870<code class="docutils literal notranslate"><span class="pre">'on'</span></code> and the following values <code class="docutils literal notranslate"><span class="pre">False</span></code>: <code class="docutils literal notranslate"><span class="pre">'0'</span></code>, <code class="docutils literal notranslate"><span class="pre">'no'</span></code>, <code class="docutils literal notranslate"><span class="pre">'false'</span></code>,871<code class="docutils literal notranslate"><span class="pre">'off'</span></code>.  You can override this by specifying a custom dictionary of strings872and their Boolean outcomes. For example:</p>873<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>874<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;section1&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;funky&#39;</span><span class="p">:</span> <span class="s1">&#39;nope&#39;</span><span class="p">}</span>875<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;section1&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;funky&#39;</span><span class="p">)</span>876<span class="gt">Traceback (most recent call last):</span>877<span class="c">...</span>878<span class="gr">ValueError</span>: <span class="n">Not a boolean: nope</span>879<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span><span class="o">.</span><span class="n">BOOLEAN_STATES</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;sure&#39;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s1">&#39;nope&#39;</span><span class="p">:</span> <span class="kc">False</span><span class="p">}</span>880<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;section1&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;funky&#39;</span><span class="p">)</span>881<span class="go">False</span>882</pre></div>883</div>884<p>Other typical Boolean pairs include <code class="docutils literal notranslate"><span class="pre">accept</span></code>/<code class="docutils literal notranslate"><span class="pre">reject</span></code> or885<code class="docutils literal notranslate"><span class="pre">enabled</span></code>/<code class="docutils literal notranslate"><span class="pre">disabled</span></code>.</p>886</dd></dl>887 888<dl class="py method">889<dt class="sig sig-object py">890<span class="sig-prename descclassname"><span class="pre">ConfigParser.</span></span><span class="sig-name descname"><span class="pre">optionxform</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">option</span></span></em><span class="sig-paren">)</span></dt>891<dd><p>This method transforms option names on every read, get, or set892operation.  The default converts the name to lowercase.  This also893means that when a configuration file gets written, all keys will be894lowercase.  Override this method if that’s unsuitable.895For example:</p>896<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">config</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>897<span class="gp">... </span><span class="s2">[Section1]</span>898<span class="gp">... </span><span class="s2">Key = Value</span>899<span class="gp">...</span>900<span class="gp">... </span><span class="s2">[Section2]</span>901<span class="gp">... </span><span class="s2">AnotherKey = Value</span>902<span class="gp">... </span><span class="s2">&quot;&quot;&quot;</span>903<span class="gp">&gt;&gt;&gt; </span><span class="n">typical</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>904<span class="gp">&gt;&gt;&gt; </span><span class="n">typical</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>905<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">typical</span><span class="p">[</span><span class="s1">&#39;Section1&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>906<span class="go">[&#39;key&#39;]</span>907<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">typical</span><span class="p">[</span><span class="s1">&#39;Section2&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>908<span class="go">[&#39;anotherkey&#39;]</span>909<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">RawConfigParser</span><span class="p">()</span>910<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span><span class="o">.</span><span class="n">optionxform</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">option</span><span class="p">:</span> <span class="n">option</span>911<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>912<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;Section1&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>913<span class="go">[&#39;Key&#39;]</span>914<span class="gp">&gt;&gt;&gt; </span><span class="nb">list</span><span class="p">(</span><span class="n">custom</span><span class="p">[</span><span class="s1">&#39;Section2&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>915<span class="go">[&#39;AnotherKey&#39;]</span>916</pre></div>917</div>918<div class="admonition note">919<p class="admonition-title">Note</p>920<p>The optionxform function transforms option names to a canonical form.921This should be an idempotent function: if the name is already in922canonical form, it should be returned unchanged.</p>923</div>924</dd></dl>925 926<dl class="py attribute">927<dt class="sig sig-object py" id="configparser.ConfigParser.SECTCRE">928<span class="sig-prename descclassname"><span class="pre">ConfigParser.</span></span><span class="sig-name descname"><span class="pre">SECTCRE</span></span><a class="headerlink" href="#configparser.ConfigParser.SECTCRE" title="Link to this definition">¶</a></dt>929<dd><p>A compiled regular expression used to parse section headers.  The default930matches <code class="docutils literal notranslate"><span class="pre">[section]</span></code> to the name <code class="docutils literal notranslate"><span class="pre">&quot;section&quot;</span></code>.  Whitespace is considered931part of the section name, thus <code class="docutils literal notranslate"><span class="pre">[</span>&#160; <span class="pre">larch</span>&#160; <span class="pre">]</span></code> will be read as a section of932name <code class="docutils literal notranslate"><span class="pre">&quot;</span>&#160; <span class="pre">larch</span>&#160; <span class="pre">&quot;</span></code>.  Override this attribute if that’s unsuitable.  For933example:</p>934<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">import</span><span class="w"> </span><span class="nn">re</span>935<span class="gp">&gt;&gt;&gt; </span><span class="n">config</span> <span class="o">=</span> <span class="s2">&quot;&quot;&quot;</span>936<span class="gp">... </span><span class="s2">[Section 1]</span>937<span class="gp">... </span><span class="s2">option = value</span>938<span class="gp">...</span>939<span class="gp">... </span><span class="s2">[  Section 2  ]</span>940<span class="gp">... </span><span class="s2">another = val</span>941<span class="gp">... </span><span class="s2">&quot;&quot;&quot;</span>942<span class="gp">&gt;&gt;&gt; </span><span class="n">typical</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>943<span class="gp">&gt;&gt;&gt; </span><span class="n">typical</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>944<span class="gp">&gt;&gt;&gt; </span><span class="n">typical</span><span class="o">.</span><span class="n">sections</span><span class="p">()</span>945<span class="go">[&#39;Section 1&#39;, &#39;  Section 2  &#39;]</span>946<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>947<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span><span class="o">.</span><span class="n">SECTCRE</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\[ *(?P&lt;header&gt;[^]]+?) *\]&quot;</span><span class="p">)</span>948<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span><span class="o">.</span><span class="n">read_string</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>949<span class="gp">&gt;&gt;&gt; </span><span class="n">custom</span><span class="o">.</span><span class="n">sections</span><span class="p">()</span>950<span class="go">[&#39;Section 1&#39;, &#39;Section 2&#39;]</span>951</pre></div>952</div>953<div class="admonition note">954<p class="admonition-title">Note</p>955<p>While ConfigParser objects also use an <code class="docutils literal notranslate"><span class="pre">OPTCRE</span></code> attribute for recognizing956option lines, it’s not recommended to override it because that would957interfere with constructor options <em>allow_no_value</em> and <em>delimiters</em>.</p>958</div>959</dd></dl>960 961</section>962<section id="legacy-api-examples">963<h2>Legacy API Examples<a class="headerlink" href="#legacy-api-examples" title="Link to this heading">¶</a></h2>964<p>Mainly because of backwards compatibility concerns, <code class="xref py py-mod docutils literal notranslate"><span class="pre">configparser</span></code>965provides also a legacy API with explicit <code class="docutils literal notranslate"><span class="pre">get</span></code>/<code class="docutils literal notranslate"><span class="pre">set</span></code> methods.  While there966are valid use cases for the methods outlined below, mapping protocol access is967preferred for new projects.  The legacy API is at times more advanced,968low-level and downright counterintuitive.</p>969<p>An example of writing to a configuration file:</p>970<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">configparser</span>971 972<span class="n">config</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">RawConfigParser</span><span class="p">()</span>973 974<span class="c1"># Please note that using RawConfigParser&#39;s set functions, you can assign</span>975<span class="c1"># non-string values to keys internally, but will receive an error when</span>976<span class="c1"># attempting to write to a file or when you get it in non-raw mode. Setting</span>977<span class="c1"># values using the mapping protocol or ConfigParser&#39;s set() does not allow</span>978<span class="c1"># such assignments to take place.</span>979<span class="n">config</span><span class="o">.</span><span class="n">add_section</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">)</span>980<span class="n">config</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;an_int&#39;</span><span class="p">,</span> <span class="s1">&#39;15&#39;</span><span class="p">)</span>981<span class="n">config</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;a_bool&#39;</span><span class="p">,</span> <span class="s1">&#39;true&#39;</span><span class="p">)</span>982<span class="n">config</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;a_float&#39;</span><span class="p">,</span> <span class="s1">&#39;3.1415&#39;</span><span class="p">)</span>983<span class="n">config</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">,</span> <span class="s1">&#39;fun&#39;</span><span class="p">)</span>984<span class="n">config</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">,</span> <span class="s1">&#39;Python&#39;</span><span class="p">)</span>985<span class="n">config</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="s1">&#39;</span><span class="si">%(bar)s</span><span class="s1"> is </span><span class="si">%(baz)s</span><span class="s1">!&#39;</span><span class="p">)</span>986 987<span class="c1"># Writing our configuration file to &#39;example.cfg&#39;</span>988<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;example.cfg&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">configfile</span><span class="p">:</span>989    <span class="n">config</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">configfile</span><span class="p">)</span>990</pre></div>991</div>992<p>An example of reading the configuration file again:</p>993<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">configparser</span>994 995<span class="n">config</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">RawConfigParser</span><span class="p">()</span>996<span class="n">config</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">&#39;example.cfg&#39;</span><span class="p">)</span>997 998<span class="c1"># getfloat() raises an exception if the value is not a float</span>999<span class="c1"># getint() and getboolean() also do this for their respective types</span>1000<span class="n">a_float</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">getfloat</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;a_float&#39;</span><span class="p">)</span>1001<span class="n">an_int</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">getint</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;an_int&#39;</span><span class="p">)</span>1002<span class="nb">print</span><span class="p">(</span><span class="n">a_float</span> <span class="o">+</span> <span class="n">an_int</span><span class="p">)</span>1003 1004<span class="c1"># Notice that the next output does not interpolate &#39;%(bar)s&#39; or &#39;%(baz)s&#39;.</span>1005<span class="c1"># This is because we are using a RawConfigParser().</span>1006<span class="k">if</span> <span class="n">config</span><span class="o">.</span><span class="n">getboolean</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;a_bool&#39;</span><span class="p">):</span>1007    <span class="nb">print</span><span class="p">(</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">))</span>1008</pre></div>1009</div>1010<p>To get interpolation, use <a class="reference internal" href="#configparser.ConfigParser" title="configparser.ConfigParser"><code class="xref py py-class docutils literal notranslate"><span class="pre">ConfigParser</span></code></a>:</p>1011<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">configparser</span>1012 1013<span class="n">cfg</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>1014<span class="n">cfg</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">&#39;example.cfg&#39;</span><span class="p">)</span>1015 1016<span class="c1"># Set the optional *raw* argument of get() to True if you wish to disable</span>1017<span class="c1"># interpolation in a single get operation.</span>1018<span class="nb">print</span><span class="p">(</span><span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="n">raw</span><span class="o">=</span><span class="kc">False</span><span class="p">))</span>  <span class="c1"># -&gt; &quot;Python is fun!&quot;</span>1019<span class="nb">print</span><span class="p">(</span><span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="n">raw</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>   <span class="c1"># -&gt; &quot;%(bar)s is %(baz)s!&quot;</span>1020 1021<span class="c1"># The optional *vars* argument is a dict with members that will take</span>1022<span class="c1"># precedence in interpolation.</span>1023<span class="nb">print</span><span class="p">(</span><span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="nb">vars</span><span class="o">=</span><span class="p">{</span><span class="s1">&#39;bar&#39;</span><span class="p">:</span> <span class="s1">&#39;Documentation&#39;</span><span class="p">,</span>1024                                       <span class="s1">&#39;baz&#39;</span><span class="p">:</span> <span class="s1">&#39;evil&#39;</span><span class="p">}))</span>1025 1026<span class="c1"># The optional *fallback* argument can be used to provide a fallback value</span>1027<span class="nb">print</span><span class="p">(</span><span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">))</span>1028      <span class="c1"># -&gt; &quot;Python is fun!&quot;</span>1029 1030<span class="nb">print</span><span class="p">(</span><span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="s1">&#39;Monty is not.&#39;</span><span class="p">))</span>1031      <span class="c1"># -&gt; &quot;Python is fun!&quot;</span>1032 1033<span class="nb">print</span><span class="p">(</span><span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;monster&#39;</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="s1">&#39;No such things as monsters.&#39;</span><span class="p">))</span>1034      <span class="c1"># -&gt; &quot;No such things as monsters.&quot;</span>1035 1036<span class="c1"># A bare print(cfg.get(&#39;Section1&#39;, &#39;monster&#39;)) would raise NoOptionError</span>1037<span class="c1"># but we can also use:</span>1038 1039<span class="nb">print</span><span class="p">(</span><span class="n">cfg</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;monster&#39;</span><span class="p">,</span> <span class="n">fallback</span><span class="o">=</span><span class="kc">None</span><span class="p">))</span>1040      <span class="c1"># -&gt; None</span>1041</pre></div>1042</div>1043<p>Default values are available in both types of ConfigParsers.  They are used in1044interpolation if an option used is not defined elsewhere.</p>1045<div class="highlight-python3 notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span><span class="w"> </span><span class="nn">configparser</span>1046 1047<span class="c1"># New instance with &#39;bar&#39; and &#39;baz&#39; defaulting to &#39;Life&#39; and &#39;hard&#39; each</span>1048<span class="n">config</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">({</span><span class="s1">&#39;bar&#39;</span><span class="p">:</span> <span class="s1">&#39;Life&#39;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">:</span> <span class="s1">&#39;hard&#39;</span><span class="p">})</span>1049<span class="n">config</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s1">&#39;example.cfg&#39;</span><span class="p">)</span>1050 1051<span class="nb">print</span><span class="p">(</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">))</span>     <span class="c1"># -&gt; &quot;Python is fun!&quot;</span>1052<span class="n">config</span><span class="o">.</span><span class="n">remove_option</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;bar&#39;</span><span class="p">)</span>1053<span class="n">config</span><span class="o">.</span><span class="n">remove_option</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;baz&#39;</span><span class="p">)</span>1054<span class="nb">print</span><span class="p">(</span><span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;Section1&#39;</span><span class="p">,</span> <span class="s1">&#39;foo&#39;</span><span class="p">))</span>     <span class="c1"># -&gt; &quot;Life is hard!&quot;</span>1055</pre></div>1056</div>1057</section>1058<section id="configparser-objects">1059<span id="id13"></span><h2>ConfigParser Objects<a class="headerlink" href="#configparser-objects" title="Link to this heading">¶</a></h2>1060<dl class="py class">1061<dt class="sig sig-object py" id="configparser.ConfigParser">1062<em class="property"><span class="k"><span class="pre">class</span></span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">configparser.</span></span><span class="sig-name descname"><span class="pre">ConfigParser</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">defaults</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dict_type</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">dict</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">allow_no_value</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em>, <em class="sig-param"><span class="keyword-only-separator o"><abbr title="Keyword-only parameters separator (PEP 3102)"><span class="pre">*</span></abbr></span></em>, <em class="sig-param"><span class="n"><span class="pre">delimiters</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">('=',</span> <span class="pre">':')</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">comment_prefixes</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">('#',</span> <span class="pre">';')</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">inline_comment_prefixes</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">strict</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">empty_lines_in_values</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">default_section</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">configparser.DEFAULTSECT</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">interpolation</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">BasicInterpolation()</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">converters</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">{}</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">allow_unnamed_section</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#configparser.ConfigParser" title="Link to this definition">¶</a></dt>1063<dd><p>The main configuration parser.  When <em>defaults</em> is given, it is initialized1064into the dictionary of intrinsic defaults.  When <em>dict_type</em> is given, it1065will be used to create the dictionary objects for the list of sections, for1066the options within a section, and for the default values.</p>1067<p>When <em>delimiters</em> is given, it is used as the set of substrings that1068divide keys from values.  When <em>comment_prefixes</em> is given, it will be used1069as the set of substrings that prefix comments in otherwise empty lines.1070Comments can be indented.  When <em>inline_comment_prefixes</em> is given, it will1071be used as the set of substrings that prefix comments in non-empty lines.</p>1072<p>When <em>strict</em> is <code class="docutils literal notranslate"><span class="pre">True</span></code> (the default), the parser won’t allow for1073any section or option duplicates while reading from a single source (file,1074string or dictionary), raising <a class="reference internal" href="#configparser.DuplicateSectionError" title="configparser.DuplicateSectionError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DuplicateSectionError</span></code></a> or1075<a class="reference internal" href="#configparser.DuplicateOptionError" title="configparser.DuplicateOptionError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DuplicateOptionError</span></code></a>.  When <em>empty_lines_in_values</em> is <code class="docutils literal notranslate"><span class="pre">False</span></code>1076(default: <code class="docutils literal notranslate"><span class="pre">True</span></code>), each empty line marks the end of an option.  Otherwise,1077internal empty lines of a multiline option are kept as part of the value.1078When <em>allow_no_value</em> is <code class="docutils literal notranslate"><span class="pre">True</span></code> (default: <code class="docutils literal notranslate"><span class="pre">False</span></code>), options without1079values are accepted; the value held for these is <code class="docutils literal notranslate"><span class="pre">None</span></code> and they are1080serialized without the trailing delimiter.</p>1081<p>When <em>default_section</em> is given, it specifies the name for the special1082section holding default values for other sections and interpolation purposes1083(normally named <code class="docutils literal notranslate"><span class="pre">&quot;DEFAULT&quot;</span></code>).  This value can be retrieved and changed at1084runtime using the <code class="docutils literal notranslate"><span class="pre">default_section</span></code> instance attribute. This won’t1085re-evaluate an already parsed config file, but will be used when writing1086parsed settings to a new config file.</p>1087<p>Interpolation behaviour may be customized by providing a custom handler1088through the <em>interpolation</em> argument. <code class="docutils literal notranslate"><span class="pre">None</span></code> can be used to turn off1089interpolation completely, <code class="docutils literal notranslate"><span class="pre">ExtendedInterpolation()</span></code> provides a more1090advanced variant inspired by <code class="docutils literal notranslate"><span class="pre">zc.buildout</span></code>.  More on the subject in the1091<a class="reference external" href="#interpolation-of-values">dedicated documentation section</a>.</p>1092<p>All option names used in interpolation will be passed through the1093<a class="reference internal" href="#configparser.ConfigParser.optionxform" title="configparser.ConfigParser.optionxform"><code class="xref py py-meth docutils literal notranslate"><span class="pre">optionxform()</span></code></a> method just like any other option name reference.  For1094example, using the default implementation of <code class="xref py py-meth docutils literal notranslate"><span class="pre">optionxform()</span></code> (which1095converts option names to lower case), the values <code class="docutils literal notranslate"><span class="pre">foo</span> <span class="pre">%(bar)s</span></code> and <code class="docutils literal notranslate"><span class="pre">foo</span>1096<span class="pre">%(BAR)s</span></code> are equivalent.</p>1097<p>When <em>converters</em> is given, it should be a dictionary where each key1098represents the name of a type converter and each value is a callable1099implementing the conversion from string to the desired datatype.  Every1100converter gets its own corresponding <code class="xref py py-meth docutils literal notranslate"><span class="pre">get*()</span></code> method on the parser1101object and section proxies.</p>1102<p>When <em>allow_unnamed_section</em> is <code class="docutils literal notranslate"><span class="pre">True</span></code> (default: <code class="docutils literal notranslate"><span class="pre">False</span></code>),1103the first section name can be omitted. See the1104<a class="reference external" href="#unnamed-sections">“Unnamed Sections” section</a>.</p>1105<p>It is possible to read several configurations into a single1106<code class="xref py py-class docutils literal notranslate"><span class="pre">ConfigParser</span></code>, where the most recently added configuration has the1107highest priority. Any conflicting keys are taken from the more recent1108configuration while the previously existing keys are retained. The example1109below reads in an <code class="docutils literal notranslate"><span class="pre">override.ini</span></code> file, which will override any conflicting1110keys from the <code class="docutils literal notranslate"><span class="pre">example.ini</span></code> file.</p>1111<div class="highlight-ini notranslate"><div class="highlight"><pre><span></span><span class="k">[DEFAULT]</span>1112<span class="na">ServerAliveInterval</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">-1</span>1113</pre></div>1114</div>1115<div class="highlight-pycon notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">config_override</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>1116<span class="gp">&gt;&gt;&gt; </span><span class="n">config_override</span><span class="p">[</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;ServerAliveInterval&#39;</span><span class="p">:</span> <span class="s1">&#39;-1&#39;</span><span class="p">}</span>1117<span class="gp">&gt;&gt;&gt; </span><span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;override.ini&#39;</span><span class="p">,</span> <span class="s1">&#39;w&#39;</span><span class="p">)</span> <span class="k">as</span> <span class="n">configfile</span><span class="p">:</span>1118<span class="gp">... </span>    <span class="n">config_override</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">configfile</span><span class="p">)</span>1119<span class="gp">...</span>1120<span class="gp">&gt;&gt;&gt; </span><span class="n">config_override</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>1121<span class="gp">&gt;&gt;&gt; </span><span class="n">config_override</span><span class="o">.</span><span class="n">read</span><span class="p">([</span><span class="s1">&#39;example.ini&#39;</span><span class="p">,</span> <span class="s1">&#39;override.ini&#39;</span><span class="p">])</span>1122<span class="go">[&#39;example.ini&#39;, &#39;override.ini&#39;]</span>1123<span class="gp">&gt;&gt;&gt; </span><span class="nb">print</span><span class="p">(</span><span class="n">config_override</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;DEFAULT&#39;</span><span class="p">,</span> <span class="s1">&#39;ServerAliveInterval&#39;</span><span class="p">))</span>1124<span class="go">-1</span>1125</pre></div>1126</div>1127<div class="versionchanged">1128<p><span class="versionmodified changed">Changed in version 3.1: </span>The default <em>dict_type</em> is <a class="reference internal" href="collections.html#collections.OrderedDict" title="collections.OrderedDict"><code class="xref py py-class docutils literal notranslate"><span class="pre">collections.OrderedDict</span></code></a>.</p>1129</div>1130<div class="versionchanged">1131<p><span class="versionmodified changed">Changed in version 3.2: </span><em>allow_no_value</em>, <em>delimiters</em>, <em>comment_prefixes</em>, <em>strict</em>,1132<em>empty_lines_in_values</em>, <em>default_section</em> and <em>interpolation</em> were1133added.</p>1134</div>1135<div class="versionchanged">1136<p><span class="versionmodified changed">Changed in version 3.5: </span>The <em>converters</em> argument was added.</p>1137</div>1138<div class="versionchanged">1139<p><span class="versionmodified changed">Changed in version 3.7: </span>The <em>defaults</em> argument is read with <a class="reference internal" href="#configparser.ConfigParser.read_dict" title="configparser.ConfigParser.read_dict"><code class="xref py py-meth docutils literal notranslate"><span class="pre">read_dict()</span></code></a>,1140providing consistent behavior across the parser: non-string1141keys and values are implicitly converted to strings.</p>1142</div>1143<div class="versionchanged">1144<p><span class="versionmodified changed">Changed in version 3.8: </span>The default <em>dict_type</em> is <a class="reference internal" href="stdtypes.html#dict" title="dict"><code class="xref py py-class docutils literal notranslate"><span class="pre">dict</span></code></a>, since it now preserves1145insertion order.</p>1146</div>1147<div class="versionchanged">1148<p><span class="versionmodified changed">Changed in version 3.13: </span>Raise a <a class="reference internal" href="#configparser.MultilineContinuationError" title="configparser.MultilineContinuationError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">MultilineContinuationError</span></code></a> when <em>allow_no_value</em> is1149<code class="docutils literal notranslate"><span class="pre">True</span></code>, and a key without a value is continued with an indented line.</p>1150</div>1151<div class="versionchanged">1152<p><span class="versionmodified changed">Changed in version 3.13: </span>The <em>allow_unnamed_section</em> argument was added.</p>1153</div>1154<dl class="py method">1155<dt class="sig sig-object py" id="configparser.ConfigParser.defaults">1156<span class="sig-name descname"><span class="pre">defaults</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#configparser.ConfigParser.defaults" title="Link to this definition">¶</a></dt>1157<dd><p>Return a dictionary containing the instance-wide defaults.</p>1158</dd></dl>1159 1160<dl class="py method">1161<dt class="sig sig-object py" id="configparser.ConfigParser.sections">1162<span class="sig-name descname"><span class="pre">sections</span></span><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#configparser.ConfigParser.sections" title="Link to this definition">¶</a></dt>1163<dd><p>Return a list of the sections available; the <em>default section</em> is not1164included in the list.</p>1165</dd></dl>1166 1167<dl class="py method">1168<dt class="sig sig-object py" id="configparser.ConfigParser.add_section">1169<span class="sig-name descname"><span class="pre">add_section</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">section</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#configparser.ConfigParser.add_section" title="Link to this definition">¶</a></dt>1170<dd><p>Add a section named <em>section</em> to the instance.  If a section by the given1171name already exists, <a class="reference internal" href="#configparser.DuplicateSectionError" title="configparser.DuplicateSectionError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">DuplicateSectionError</span></code></a> is raised.  If the1172<em>default section</em> name is passed, <a class="reference internal" href="exceptions.html#ValueError" title="ValueError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">ValueError</span></code></a> is raised.  The name1173of the section must be a string; if not, <a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a> is raised.</p>1174<div class="versionchanged">1175<p><span class="versionmodified changed">Changed in version 3.2: </span>Non-string section names raise <a class="reference internal" href="exceptions.html#TypeError" title="TypeError"><code class="xref py py-exc docutils literal notranslate"><span class="pre">TypeError</span></code></a>.</p>1176</div>1177</dd></dl>1178 1179<dl class="py method">1180<dt class="sig sig-object py" id="configparser.ConfigParser.has_section">1181<span class="sig-name descname"><span class="pre">has_section</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">section</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#configparser.ConfigParser.has_section" title="Link to this definition">¶</a></dt>1182<dd><p>Indicates whether the named <em>section</em> is present in the configuration.1183The <em>default section</em> is not acknowledged.</p>1184</dd></dl>1185 1186<dl class="py method">1187<dt class="sig sig-object py" id="configparser.ConfigParser.options">1188<span class="sig-name descname"><span class="pre">options</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">section</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#configparser.ConfigParser.options" title="Link to this definition">¶</a></dt>1189<dd><p>Return a list of options available in the specified <em>section</em>.</p>1190</dd></dl>1191 1192<dl class="py method">1193<dt class="sig sig-object py" id="configparser.ConfigParser.has_option">1194<span class="sig-name descname"><span class="pre">has_option</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">section</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">option</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#configparser.ConfigParser.has_option" title="Link to this definition">¶</a></dt>1195<dd><p>If the given <em>section</em> exists, and contains the given <em>option</em>, return1196<a class="reference internal" href="constants.html#True" title="True"><code class="xref py py-const docutils literal notranslate"><span class="pre">True</span></code></a>; otherwise return <a class="reference internal" href="constants.html#False" title="False"><code class="xref py py-const docutils literal notranslate"><span class="pre">False</span></code></a>.  If the specified1197<em>section</em> is <a class="reference internal" href="constants.html#None" title="None"><code class="xref py py-const docutils literal notranslate"><span class="pre">None</span></code></a> or an empty string, DEFAULT is assumed.</p>1198</dd></dl>1199 1200<dl class="py method">

Showing the first 1,200 of 1779 lines. Download the file for the rest.