configparser.md
1> **Источник:** https://python-all.ru/3.2/library/configparser.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 13.2. [`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser) – Парсер конфигурационных файлов89Этот модуль предоставляет класс [`ConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser), реализующий базовый язык конфигурации со структурой, похожей на ту, что используется в INI-файлах Microsoft Windows. Его можно использовать для написания программ на Python, которые конечные пользователи могут легко настраивать.1011> **Примечание**12>13> Эта библиотека *не* интерпретирует и не записывает префиксы типов значений, используемые в расширенной версии синтаксиса INI из реестра Windows.1415> **См. также**16>17> **Модуль [`shlex`](https://python-all.ru/3.2/library/shlex.html#module-shlex)**18>19> Поддержка создания мини-языков в стиле оболочки Unix, которые можно использовать в качестве альтернативного формата для файлов конфигурации приложений.20>21> **Модуль [`json`](https://python-all.ru/3.2/library/json.html#module-json)**22>23> Модуль json реализует подмножество синтаксиса JavaScript, которое также можно использовать для этой цели.2425## 13.2.1. Быстрый старт2627Рассмотрим простейший конфигурационный файл, который выглядит так:2829```ini30[DEFAULT]31ServerAliveInterval = 4532Compression = yes33CompressionLevel = 934ForwardX11 = yes3536[bitbucket.org]37User = hg3839[topsecret.server.com]40Port = 5002241ForwardX11 = no42```4344Структура INI-файлов описана [в следующем разделе](https://python-all.ru/3.2/library/configparser.html#supported-ini-file-structure). По сути, файл состоит из разделов, каждый из которых содержит ключи со значениями. Классы [`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser) могут читать и записывать такие файлы. Начнём с программного создания приведённого выше конфигурационного файла.4546```python47>>> import configparser48>>> config = configparser.ConfigParser()49>>> config['DEFAULT'] = {'ServerAliveInterval': '45',50... 'Compression': 'yes',51... 'CompressionLevel': '9'}52>>> config['bitbucket.org'] = {}53>>> config['bitbucket.org']['User'] = 'hg'54>>> config['topsecret.server.com'] = {}55>>> topsecret = config['topsecret.server.com']56>>> topsecret['Port'] = '50022' # изменяет парсер57>>> topsecret['ForwardX11'] = 'no' # то же самое58>>> config['DEFAULT']['ForwardX11'] = 'yes'59>>> with open('example.ini', 'w') as configfile:60... config.write(configfile)61...62```6364Как видите, парсер конфигураций можно использовать почти как словарь. Есть различия, [описанные далее](https://python-all.ru/3.2/library/configparser.html#mapping-protocol-access), но поведение очень близко к тому, что можно ожидать от словаря.6566Теперь, когда мы создали и сохранили конфигурационный файл, давайте прочитаем его и изучим содержащиеся в нем данные.6768```python69>>> import configparser70>>> config = configparser.ConfigParser()71>>> config.sections()72[]73>>> config.read('example.ini')74['example.ini']75>>> config.sections()76['bitbucket.org', 'topsecret.server.com']77>>> 'bitbucket.org' in config78True79>>> 'bytebong.com' in config80False81>>> config['bitbucket.org']['User']82'hg'83>>> config['DEFAULT']['Compression']84'yes'85>>> topsecret = config['topsecret.server.com']86>>> topsecret['ForwardX11']87'no'88>>> topsecret['Port']89'50022'90>>> for key in config['bitbucket.org']: print(key)91...92user93compressionlevel94serveraliveinterval95compression96forwardx1197>>> config['bitbucket.org']['ForwardX11']98'yes'99```100101Как видно выше, API довольно прост. Единственная магия заключается в разделе `DEFAULT`, который предоставляет значения по умолчанию для всех остальных разделов [\[1\]](https://python-all.ru/3.2/library/configparser.html#id13). Также обратите внимание, что ключи в разделах нечувствительны к регистру и хранятся в нижнем регистре [\[1\]](https://python-all.ru/3.2/library/configparser.html#id13).102103## 13.2.2. Поддерживаемые типы данных104105Парсеры конфигураций не угадывают типы данных значений в конфигурационных файлах, а всегда хранят их внутри как строки. Это означает, что если вам нужны другие типы данных, преобразование нужно выполнять самостоятельно:106107```python108>>> int(topsecret['Port'])10950022110>>> float(topsecret['CompressionLevel'])1119.0112```113114Однако извлечение логических значений не так просто. Передача значения в `bool()` не поможет, так как `bool('False')` всё равно равно `True`. Поэтому парсеры конфигурации также предоставляют `getboolean()`. Этот метод нечувствителен к регистру и распознаёт логические значения из `'yes'`/`'no'`, `'on'`/`'off'` и `'1'`/`'0'` [\[1\]](https://python-all.ru/3.2/library/configparser.html#id13). Например:115116```python117>>> topsecret.getboolean('ForwardX11')118False119>>> config['bitbucket.org'].getboolean('ForwardX11')120True121>>> config.getboolean('bitbucket.org', 'Compression')122True123```124125Помимо `getboolean()`, парсеры конфигурации также предоставляют аналогичные методы `getint()` и `getfloat()`, но они гораздо менее полезны, поскольку для этих типов достаточно преобразования с помощью [`int()`](https://python-all.ru/3.2/library/functions.html#int) и [`float()`](https://python-all.ru/3.2/library/functions.html#float).126127## 13.2.3. Значения по умолчанию128129Как и со словарём, можно использовать метод `get()` раздела для предоставления запасных значений:130131```python132>>> topsecret.get('Port')133'50022'134>>> topsecret.get('CompressionLevel')135'9'136>>> topsecret.get('Cipher')137>>> topsecret.get('Cipher', '3des-cbc')138'3des-cbc'139```140141Обратите внимание, что значения по умолчанию имеют приоритет над запасными значениями. Например, в нашем примере ключ `'CompressionLevel'` был указан только в разделе `'DEFAULT'`. Если мы попытаемся получить его из раздела `'topsecret.server.com'`, мы всегда получим значение по умолчанию, даже если укажем запасное:142143```python144>>> topsecret.get('CompressionLevel', '3')145'9'146```147148Следует также знать, что метод `get()` на уровне парсера предоставляет пользовательский, более сложный интерфейс, сохраняемый для обратной совместимости. При использовании этого метода запасное значение можно передать через именованный аргумент `fallback`:149150```python151>>> config.get('bitbucket.org', 'monster',152... fallback='No such things as monsters')153'No such things as monsters'154```155156Тот же аргумент `fallback` можно использовать с методами `getint()`, `getfloat()` и `getboolean()`, например:157158```python159>>> 'BatchMode' in topsecret160False161>>> topsecret.getboolean('BatchMode', fallback=True)162True163>>> config['DEFAULT']['BatchMode'] = 'no'164>>> topsecret.getboolean('BatchMode', fallback=True)165False166```167168## 13.2.4. Поддерживаемая структура INI-файлов169170Файл конфигурации состоит из разделов, каждый из которых начинается с заголовка `[section]`, за которым следуют записи ключ/значение, разделённые определённой строкой (по умолчанию `=` или `:` [\[1\]](https://python-all.ru/3.2/library/configparser.html#id13)). По умолчанию имена разделов чувствительны к регистру, а ключи – нет [\[1\]](https://python-all.ru/3.2/library/configparser.html#id13). Начальные и конечные пробелы удаляются из ключей и значений. Значения могут отсутствовать, и в этом случае разделитель ключ/значение также может быть опущен. Значения также могут занимать несколько строк, если они имеют отступ глубже, чем первая строка значения. В зависимости от режима парсера пустые строки могут рассматриваться как части многострочных значений или игнорироваться.171172Конфигурационные файлы могут содержать комментарии, начинающиеся с определенных символов (по умолчанию `#` и `;` [\[1\]](https://python-all.ru/3.2/library/configparser.html#id13)). Комментарии могут располагаться на отдельной пустой строке, возможно с отступом. [\[1\]](https://python-all.ru/3.2/library/configparser.html#id13)173174Например:175176```ini177[Simple Values]178key=value179spaces in keys=allowed180spaces in values=allowed as well181spaces around the delimiter = obviously182you can also use : to delimit keys from values183184[All Values Are Strings]185values like this: 1000000186or this: 3.14159265359187are they treated as numbers? : no188integers, floats and booleans are held as: strings189can use the API to get converted values directly: true190191[Multiline Values]192chorus: I'm a lumberjack, and I'm okay193 I sleep all night and I work all day194195[No Values]196key_without_value197empty string value here =198199[You can use comments]200# like this201; or this202203# By default only in an empty line.204# Inline comments can be harmful because they prevent users205# from using the delimiting characters as parts of values.206# That being said, this can be customized.207208 [Sections Can Be Indented]209 can_values_be_as_well = True210 does_that_mean_anything_special = False211 purpose = formatting for readability212 multiline_values = are213 handled just fine as214 long as they are indented215 deeper than the first line216 of a value217 # Did I mention we can indent comments, too?218```219220## 13.2.5. Интерполяция значений221222В дополнение к основной функциональности [`ConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser) поддерживает интерполяцию. Это означает, что значения могут быть предварительно обработаны перед возвратом из вызовов `get()`.223224#### `class configparser.BasicInterpolation`225226Реализация по умолчанию, используемая [`ConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser). Она позволяет значениям содержать строки формата, которые ссылаются на другие значения в том же разделе или значения в специальном разделе по умолчанию [\[1\]](https://python-all.ru/3.2/library/configparser.html#id13). Дополнительные значения по умолчанию могут быть предоставлены при инициализации.227228Например:229230```ini231[Paths]232home_dir: /Users233my_dir: %(home_dir)s/lumberjack234my_pictures: %(my_dir)s/Pictures235```236237В приведённом выше примере [`ConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser) с *interpolation*, установленным в `BasicInterpolation()`, разрешит `%(home_dir)s` в значение `home_dir` (в данном случае `/Users`). `%(my_dir)s` в итоге будет разрешено в `/Users/lumberjack`. Все интерполяции выполняются по требованию, поэтому ключи, используемые в цепочке ссылок, не обязательно должны быть указаны в каком-либо определённом порядке в файле конфигурации.238239При `interpolation`, установленном в `None`, парсер просто вернёт `%(my_dir)s/Pictures` в качестве значения `my_pictures` и `%(home_dir)s/lumberjack` в качестве значения `my_dir`.240241#### `class configparser.ExtendedInterpolation`242243Альтернативный обработчик интерполяции, реализующий более продвинутый синтаксис, используемый, например, в `zc.buildout`. Расширенная интерполяция использует `${section:option}` для обозначения значения из другого раздела. Интерполяция может распространяться на несколько уровней. Для удобства, если часть `section:` опущена, интерполяция по умолчанию применяется к текущему разделу (и, возможно, к значениям по умолчанию из специального раздела).244245Например, конфигурация, заданная выше с базовой интерполяцией, с расширенной интерполяцией будет выглядеть так:246247```ini248[Paths]249home_dir: /Users250my_dir: ${home_dir}/lumberjack251my_pictures: ${my_dir}/Pictures252```253254Значения из других разделов также можно получать:255256```ini257[Common]258home_dir: /Users259library_dir: /Library260system_dir: /System261macports_dir: /opt/local262263[Frameworks]264Python: 3.2265path: ${Common:system_dir}/Library/Frameworks/266267[Arthur]268nickname: Two Sheds269last_name: Jackson270my_dir: ${Common:home_dir}/twosheds271my_pictures: ${my_dir}/Pictures272python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}273```274275## 13.2.6. Доступ через протокол отображения276277Новое в версии 3.2.278279Доступ через протокол отображения – это общее название функциональности, позволяющей использовать пользовательские объекты как словари. В случае [`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser) реализация интерфейса отображения использует нотацию `parser['section']['option']`.280281`parser['section']` в частности возвращает прокси для данных раздела в парсере. Это означает, что значения не копируются, а берутся из исходного парсера по запросу. Что ещё более важно, при изменении значений на прокси раздела они фактически изменяются в исходном парсере.282283[`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser) объекты ведут себя максимально близко к настоящим словарям. Интерфейс отображения полон и соответствует абстрактному базовому классу `MutableMapping`. Однако есть несколько отличий, которые следует учитывать:284285- По умолчанию все ключи в разделах доступны без учёта регистра [\[1\]](https://python-all.ru/3.2/library/configparser.html#id13). Например, `for option in parser["section"]` возвращает только `optionxform`-имена ключей опций. Это означает ключи в нижнем регистре по умолчанию. В то же время для раздела, содержащего ключ `'a'`, оба выражения возвращают `True`:286287 ```python288 "a" in parser["section"]289 "A" in parser["section"]290 ```291- Все секции также включают значения `DEFAULTSECT`, что означает, что `.clear()` для секции может не сделать секцию явно пустой. Это потому, что значения по умолчанию нельзя удалить из секции (технически их там нет). Если они были переопределены в секции, удаление приводит к тому, что значение по умолчанию снова становится видимым. Попытка удалить значение по умолчанию приводит к `KeyError`.292- `DEFAULTSECT` не может быть удалён из парсера:293294 - попытка удалить его вызывает `ValueError`,295 - `parser.clear()` оставляет его нетронутым,296 - `parser.popitem()` никогда не возвращает его.297- `parser.get(section, option, **kwargs)` – второй аргумент **не является** запасным значением. Однако обратите внимание, что методы `get()` на уровне раздела совместимы как с протоколом отображения, так и с классическим API configparser.298- `parser.items()` совместим с протоколом отображения (возвращает список пар *имя\_раздела*, *proxy\_раздела*, включая DEFAULTSECT). Однако этот метод также можно вызывать с аргументами: `parser.items(section, raw, vars)`. Второй вызов возвращает список пар *опция*, *значение* для указанного `раздела`, со всеми развёрнутыми подстановками (если не передан `raw=True`).299300Протокол отображения реализован поверх существующего устаревшего API, поэтому подклассы, переопределяющие исходный интерфейс, по-прежнему должны работать с отображением, как и ожидается.301302## 13.2.7. Настройка поведения парсера303304Существует почти столько же вариантов INI-формата, сколько приложений, использующих его. [`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser) прилагает большие усилия для поддержки максимально разумного набора доступных стилей INI. Функциональность по умолчанию в основном обусловлена историческими причинами, и, скорее всего, потребуется настроить некоторые её возможности.305306Самый распространённый способ изменить поведение конкретного анализатора конфигов – использовать параметры [`__init__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__init__):307308- *defaults*, значение по умолчанию: `None`309310 Этот параметр принимает словарь пар ключ-значение, который изначально помещается в раздел `DEFAULT`. Это изящный способ поддержки лаконичных файлов конфигурации, в которых не указываются значения, совпадающие с документированными по умолчанию.311312 Подсказка: если нужно указать значения по умолчанию для конкретного раздела, используйте `read_dict()` перед чтением самого файла.313- *dict\_type*, значение по умолчанию: [`collections.OrderedDict`](https://python-all.ru/3.2/library/collections.html#collections.OrderedDict)314315 Эта опция существенно влияет на то, как будет вести себя протокол отображения и как выглядят записанные файлы конфигурации. При использовании упорядоченного словаря по умолчанию каждый раздел хранится в порядке добавления в анализатор. То же самое относится и к опциям внутри разделов.316317 Альтернативный тип словаря можно использовать, например, для сортировки разделов и опций при обратной записи. Также можно использовать обычный словарь по соображениям производительности.318319 Обратите внимание: существует несколько способов добавления набора пар ключ-значение за одну операцию. Если в таких операциях используется обычный словарь, порядок ключей может быть случайным. Например:320321 ```python322 >>> parser = configparser.ConfigParser()323 >>> parser.read_dict({'section1': {'key1': 'value1',324 ... 'key2': 'value2',325 ... 'key3': 'value3'},326 ... 'section2': {'keyA': 'valueA',327 ... 'keyB': 'valueB',328 ... 'keyC': 'valueC'},329 ... 'section3': {'foo': 'x',330 ... 'bar': 'y',331 ... 'baz': 'z'}332 ... })333 >>> parser.sections()334 ['section3', 'section2', 'section1']335 >>> [option for option in parser['section3']]336 ['baz', 'foo', 'bar']337 ```338339 В таких операциях также необходимо использовать упорядоченный словарь:340341 ```python342 >>> from collections import OrderedDict343 >>> parser = configparser.ConfigParser()344 >>> parser.read_dict(345 ... OrderedDict((346 ... ('s1',347 ... OrderedDict((348 ... ('1', '2'),349 ... ('3', '4'),350 ... ('5', '6'),351 ... ))352 ... ),353 ... ('s2',354 ... OrderedDict((355 ... ('a', 'b'),356 ... ('c', 'd'),357 ... ('e', 'f'),358 ... ))359 ... ),360 ... ))361 ... )362 >>> parser.sections()363 ['s1', 's2']364 >>> [option for option in parser['s1']]365 ['1', '3', '5']366 >>> [option for option in parser['s2'].values()]367 ['b', 'd', 'f']368 ```369- *allow\_no\_value*, значение по умолчанию: `False`370371 Некоторые файлы конфигурации содержат настройки без значений, но в остальном соответствуют синтаксису, поддерживаемому [`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser). Параметр *allow\_no\_value* конструктора можно использовать, чтобы указать, что такие значения следует принимать:372373 ```python374 >>> import configparser375376 >>> sample_config = """377 ... [mysqld]378 ... user = mysql379 ... pid-file = /var/run/mysqld/mysqld.pid380 ... skip-external-locking381 ... old_passwords = 1382 ... skip-bdb383 ... # we don't need ACID today384 ... skip-innodb385 ... """386 >>> config = configparser.ConfigParser(allow_no_value=True)387 >>> config.read_string(sample_config)388389 >>> # Настройки со значениями обрабатываются как и раньше:390 >>> config["mysqld"]["user"]391 'mysql'392393 >>> # Настройки без значений дают None:394 >>> config["mysqld"]["skip-bdb"]395396 >>> # Настройки, которые не указаны, по-прежнему вызывают ошибку:397 >>> config["mysqld"]["does-not-exist"]398 Traceback (most recent call last):399 ...400 KeyError: 'does-not-exist'401 ```402- *delimiters*, значение по умолчанию: `('=', ':')`403404 Разделители – это подстроки, которые отделяют ключи от значений в рамках секции. Первое вхождение подстроки-разделителя в строке считается разделителем. Это означает, что значения (но не ключи) могут содержать разделители.405406 См. также аргумент *space\_around\_delimiters* функции [`ConfigParser.write()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.write).407- *comment\_prefixes*, значение по умолчанию: `('#', ';')`408- *inline\_comment\_prefixes*, значение по умолчанию: `None`409410 Префиксы комментариев – это строки, указывающие на начало допустимого комментария в файле конфигурации. *comment\_prefixes* используются только на пустых строках (возможно с отступом), тогда как *inline\_comment\_prefixes* могут использоваться после любого допустимого значения (например, названий разделов, опций и пустых строк). По умолчанию встроенные комментарии отключены, а в качестве префиксов для комментариев на всю строку используются `'#'` и `';'`.411412 Изменено в версии 3.2: В предыдущих версиях [`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser) поведение соответствовало `comment_prefixes=('#',';')` и `inline_comment_prefixes=(';',)`.413414 Обратите внимание: анализаторы конфигов не поддерживают экранирование префиксов комментариев, поэтому использование *inline\_comment\_prefixes* может помешать пользователям указывать значения опций, содержащие символы, используемые как префиксы комментариев. При сомнениях избегайте установки *inline\_comment\_prefixes*. В любом случае, единственный способ сохранить символы префиксов комментариев в начале строки в многострочных значениях – это подстановка префикса, например:415416 ```python417 >>> from configparser import ConfigParser, ExtendedInterpolation418 >>> parser = ConfigParser(interpolation=ExtendedInterpolation())419 >>> # можно также использовать стандартный BasicInterpolation420 >>> parser.read_string("""421 ... [DEFAULT]422 ... hash = #423 ...424 ... [hashes]425 ... shebang =426 ... ${hash}!/usr/bin/env python427 ... ${hash} -*- coding: utf-8 -*-428 ...429 ... extensions =430 ... enabled_extension431 ... another_extension432 ... #disabled_by_comment433 ... yet_another_extension434 ...435 ... interpolation not necessary = if # is not at line start436 ... even in multiline values = line #1437 ... line #2438 ... line #3439 ... """)440 >>> print(parser['hashes']['shebang'])441442 #!/usr/bin/env python443 # -*- coding: utf-8 -*-444 >>> print(parser['hashes']['extensions'])445446 enabled_extension447 another_extension448 yet_another_extension449 >>> print(parser['hashes']['interpolation not necessary'])450 if # is not at line start451 >>> print(parser['hashes']['even in multiline values'])452 line #1453 line #2454 line #3455 ```456- *strict*, значение по умолчанию: `True`457458 Если установлено значение `True`, анализатор не допускает дублирования разделов или опций при чтении из одного источника (с помощью `read_file()`, `read_string()` или `read_dict()`). В новых приложениях рекомендуется использовать строгие анализаторы.459460 Изменено в версии 3.2: В предыдущих версиях [`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser) поведение соответствовало `strict=False`.461- *empty\_lines\_in\_values*, значение по умолчанию: `True`462463 В парсерах конфигурации значения могут занимать несколько строк, если их отступ больше, чем у ключа, к которому они относятся. По умолчанию парсеры также допускают, чтобы пустые строки были частью значений. В то же время сами ключи могут иметь произвольный отступ для улучшения читаемости. В результате, когда конфигурационные файлы становятся большими и сложными, пользователю легко потерять представление о структуре файла. Рассмотрим пример:464465 ```ini466 [Section]467 key = multiline468 value with a gotcha469470 this = is still a part of the multiline value of 'key'471 ```472473 Это может быть особенно проблематично для пользователя, если он использует пропорциональный шрифт для редактирования файла. Поэтому, если вашему приложению не требуются значения с пустыми строками, стоит запретить их. Это заставит пустые строки каждый раз разделять ключи. В приведённом выше примере получилось бы два ключа: `key` и `this`.474- *default\_section*, значение по умолчанию: `configparser.DEFAULTSECT` (то есть `"DEFAULT"`)475476 Соглашение о выделении специального раздела со значениями по умолчанию для других разделов или для целей интерполяции – это мощная концепция данной библиотеки, позволяющая создавать сложные декларативные конфигурации. Обычно этот раздел называется `"DEFAULT"`, но его можно настроить на любое другое допустимое имя раздела. Некоторые типичные значения: `"general"` или `"common"`. Указанное имя используется для распознавания разделов по умолчанию при чтении из любого источника, а также при записи конфигурации обратно в файл. Текущее значение можно получить с помощью атрибута `parser_instance.default_section` и изменить во время выполнения (например, для преобразования файлов из одного формата в другой).477- *interpolation*, значение по умолчанию: `configparser.BasicInterpolation`478479 Поведение интерполяции можно настроить, передав собственный обработчик через аргумент *interpolation*. Значение `None` можно использовать для полного отключения интерполяции, `ExtendedInterpolation()` предоставляет более продвинутый вариант, вдохновлённый `zc.buildout`. Подробнее об этом в [специальном разделе документации](https://python-all.ru/3.2/library/configparser.html#interpolation-of-values). [`RawConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.RawConfigParser) имеет значение по умолчанию `None`.480481Более продвинутая настройка может быть выполнена путём переопределения значений по умолчанию этих атрибутов парсера. Значения по умолчанию определены в классах, поэтому их можно переопределить в подклассах или путём присваивания атрибутов.482483#### `configparser.BOOLEAN_STATES`484485По умолчанию при использовании `getboolean()` анализаторы конфигов считают следующие значения `True`: `'1'`, `'yes'`, `'true'`, `'on'`, а следующие значения `False`: `'0'`, `'no'`, `'false'`, `'off'`. Можно переопределить это, указав собственный словарь строк и их булевых значений. Например:486487```python488>>> custom = configparser.ConfigParser()489>>> custom['section1'] = {'funky': 'nope'}490>>> custom['section1'].getboolean('funky')491Traceback (most recent call last):492...493ValueError: Not a boolean: nope494>>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False}495>>> custom['section1'].getboolean('funky')496False497```498499Другие типичные булевы пары включают `accept`/`reject` или `enabled`/`disabled`.500501#### `configparser.optionxform(option)`502503Этот метод преобразует имена параметров при каждой операции чтения, получения или установки. По умолчанию он приводит имя к нижнему регистру. Это также означает, что при записи конфигурационного файла все ключи будут в нижнем регистре. Переопределите этот метод, если такое поведение не подходит. Например:504505```python506>>> config = """507... [Section1]508... Key = Value509...510... [Section2]511... AnotherKey = Value512... """513>>> typical = configparser.ConfigParser()514>>> typical.read_string(config)515>>> list(typical['Section1'].keys())516['key']517>>> list(typical['Section2'].keys())518['anotherkey']519>>> custom = configparser.RawConfigParser()520>>> custom.optionxform = lambda option: option521>>> custom.read_string(config)522>>> list(custom['Section1'].keys())523['Key']524>>> list(custom['Section2'].keys())525['AnotherKey']526```527528#### `configparser.SECTCRE`529530Скомпилированное регулярное выражение для разбора заголовков разделов. По умолчанию соответствует `[section]` имени `"section"`. Пробелы считаются частью имени раздела, поэтому `[ larch ]` будет прочитан как раздел с именем `" larch "`. Переопределите этот атрибут, если это не подходит. Например:531532```python533>>> config = """534... [Section 1]535... option = value536...537... [ Section 2 ]538... another = val539... """540>>> typical = ConfigParser()541>>> typical.read_string(config)542>>> typical.sections()543['Section 1', ' Section 2 ']544>>> custom = ConfigParser()545>>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")546>>> custom.read_string(config)547>>> custom.sections()548['Section 1', 'Section 2']549```550551> **Примечание**552>553> Хотя объекты ConfigParser также используют атрибут `OPTCRE` для распознавания строк опций, переопределять его не рекомендуется, так как это будет мешать параметрам конструктора *allow\_no\_value* и *delimiters*.554555## 13.2.8. Примеры устаревшего API556557В основном из соображений обратной совместимости [`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser) также предоставляет устаревший API с явными методами `get`/`set`. Хотя для описанных ниже методов есть обоснованные случаи использования, для новых проектов предпочтительнее доступ через протокол отображения. Устаревший API временами более продвинутый, низкоуровневый и откровенно неинтуитивный.558559Пример записи в файл конфигурации:560561```python562import configparser563564config = configparser.RawConfigParser()565566# Обратите внимание: используя функции set класса RawConfigParser, можно присваивать567# ключам внутренние значения, не являющиеся строками, но при попытке568# записи в файл или при получении значения в не-сыром режиме возникнет ошибка. Присваивание569# значений через протокол отображения или ConfigParser.set() не допускает570# выполнения таких присваиваний.571config.add_section('Section1')572config.set('Section1', 'an_int', '15')573config.set('Section1', 'a_bool', 'true')574config.set('Section1', 'a_float', '3.1415')575config.set('Section1', 'baz', 'fun')576config.set('Section1', 'bar', 'Python')577config.set('Section1', 'foo', '%(bar)s is %(baz)s!')578579# Записываем наш конфигурационный файл в 'example.cfg'580with open('example.cfg', 'w') as configfile:581 config.write(configfile)582```583584Пример повторного чтения файла конфигурации:585586```python587import configparser588589config = configparser.RawConfigParser()590config.read('example.cfg')591592# getfloat() вызывает исключение, если значение не является float.593# getint() и getboolean() делают то же самое для своих типов.594a_float = config.getfloat('Section1', 'a_float')595an_int = config.getint('Section1', 'an_int')596print(a_float + an_int)597598# Обратите внимание, что следующий вывод не интерполирует '%(bar)s' или '%(baz)s'.599# Это потому, что мы используем RawConfigParser().600if config.getboolean('Section1', 'a_bool'):601 print(config.get('Section1', 'foo'))602```603604Чтобы получить интерполяцию, используйте [`ConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser):605606```python607import configparser608609cfg = configparser.ConfigParser()610cfg.read('example.cfg')611612# Установите необязательный аргумент *raw* метода get() в True, если требуется отключить613# интерполяцию в одной операции get.614print(cfg.get('Section1', 'foo', raw=False)) # -> "Python – это весело!"615print(cfg.get('Section1', 'foo', raw=True)) # -> "%(bar)s – это %(baz)s!"616617# Необязательный аргумент *vars* – это словарь с элементами, которые будут иметь618# приоритет при интерполяции.619print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation',620 'baz': 'evil'}))621622# Необязательный аргумент *fallback* можно использовать для предоставления запасного значения623print(cfg.get('Section1', 'foo'))624 # -> "Python – это весело!"625626print(cfg.get('Section1', 'foo', fallback='Monty is not.'))627 # -> "Python – это весело!"628629print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))630 # -> "Монстров не существует."631632# Голый вызов print(cfg.get('Section1', 'monster')) вызовет NoOptionError, но мы также можем использовать:633# но мы также можем использовать:634635print(cfg.get('Section1', 'monster', fallback=None))636 # -> None637```638639Значения по умолчанию доступны в обоих типах ConfigParsers. Они используются при интерполяции, если используемая опция не определена в другом месте.640641```python642import configparser643644# Новый экземпляр с 'bar' и 'baz', по умолчанию равными 'Life' и 'hard' соответственно.645config = configparser.ConfigParser({'bar': 'Life', 'baz': 'hard'})646config.read('example.cfg')647648print(config.get('Section1', 'foo')) # -> "Python – это весело!"649config.remove_option('Section1', 'bar')650config.remove_option('Section1', 'baz')651print(config.get('Section1', 'foo')) # -> "Жизнь тяжела!"652```653654## 13.2.9. Объекты ConfigParser655656#### `class configparser.ConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation())`657658Основной парсер конфигурации. Когда задан *defaults*, он инициализируется как словарь внутренних значений по умолчанию. Когда задан *dict\_type*, он будет использоваться для создания словарей для списка разделов, опций внутри раздела и значений по умолчанию.659660Если указан *delimiters*, он используется как набор подстрок, разделяющих ключи и значения. Если указан *comment\_prefixes*, он будет использоваться как набор подстрок, обозначающих начало комментария в пустых строках. Комментарии могут быть с отступом. Если указан *inline\_comment\_prefixes*, он будет использоваться как набор подстрок, обозначающих начало комментария в непустых строках.661662Если *strict* равен `True` (по умолчанию), синтаксический анализатор не допустит повторяющихся разделов или параметров при чтении из одного источника (файла, строки или словаря), вызывая [`DuplicateSectionError`](https://python-all.ru/3.2/library/configparser.html#configparser.DuplicateSectionError) или [`DuplicateOptionError`](https://python-all.ru/3.2/library/configparser.html#configparser.DuplicateOptionError). Если *empty\_lines\_in\_values* равен `False` (по умолчанию: `True`), каждая пустая строка означает конец параметра. В противном случае внутренние пустые строки многострочного параметра сохраняются как часть значения. Если *allow\_no\_value* равен `True` (по умолчанию: `False`), параметры без значений принимаются; значение для них равно `None`, и они сериализуются без завершающего разделителя.663664Если указан *default\_section*, он задаёт имя для специального раздела, содержащего значения по умолчанию для других разделов и целей интерполяции (обычно называется `"DEFAULT"`). Это значение можно получить и изменить во время выполнения с помощью атрибута экземпляра `default_section`.665666Поведение интерполяции можно настроить, предоставив пользовательский обработчик через аргумент *interpolation*. `None` можно использовать для полного отключения интерполяции, `ExtendedInterpolation()` предоставляет более продвинутый вариант, вдохновлённый `zc.buildout`. Подробнее об этом в [соответствующем разделе документации](https://python-all.ru/3.2/library/configparser.html#interpolation-of-values).667668Все имена параметров, используемые в интерполяции, будут переданы через метод [`optionxform()`](https://python-all.ru/3.2/library/configparser.html#configparser.optionxform), как и любая другая ссылка на имя параметра. Например, при использовании стандартной реализации [`optionxform()`](https://python-all.ru/3.2/library/configparser.html#configparser.optionxform) (которая преобразует имена параметров в нижний регистр) значения `foo %(bar)s` и `foo %(BAR)s` эквивалентны.669670Изменено в версии 3.1: По умолчанию *dict\_type* имеет значение [`collections.OrderedDict`](https://python-all.ru/3.2/library/collections.html#collections.OrderedDict).671672Изменено в версии 3.2: *allow\_no\_value*, *delimiters*, *comment\_prefixes*, *strict*, *empty\_lines\_in\_values*, *default\_section* и *interpolation* были добавлены.673674#### `defaults()`675676Возвращает словарь, содержащий значения по умолчанию для экземпляра.677678#### `sections()`679680Возвращает список доступных разделов; *раздел по умолчанию* не включён в список.681682#### `add_section(section)`683684Добавляет раздел с именем *section* в экземпляр. Если раздел с таким именем уже существует, вызывается [`DuplicateSectionError`](https://python-all.ru/3.2/library/configparser.html#configparser.DuplicateSectionError). Если передано имя *раздела по умолчанию*, вызывается [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError). Имя раздела должно быть строкой; в противном случае вызывается [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError).685686Изменено в версии 3.2: Названия секций, не являющиеся строками, вызывают [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError).687688#### `has_section(section)`689690Указывает, присутствует ли в конфигурации указанный *раздел*. *Раздел по умолчанию* не учитывается.691692#### `options(section)`693694Возвращает список доступных параметров в указанном *разделе*.695696#### `has_option(section, option)`697698Если указанный *section* существует и содержит указанный *option*, возвращает [`True`](https://python-all.ru/3.2/library/constants.html#True); в противном случае возвращает [`False`](https://python-all.ru/3.2/library/constants.html#False). Если указанный *section* равен [`None`](https://python-all.ru/3.2/library/constants.html#None) или пустой строке, предполагается DEFAULT.699700#### `read(filenames, encoding=None)`701702Пытается прочитать и разобрать список имён файлов, возвращая список имён файлов, которые были успешно разобраны. Если *filenames* является строкой, она рассматривается как одно имя файла. Если файл, указанный в *filenames*, не может быть открыт, этот файл будет проигнорирован. Это сделано так, чтобы можно было указать список потенциальных мест расположения файлов конфигурации (например, текущий каталог, домашний каталог пользователя и какой-нибудь общесистемный каталог), и все существующие файлы конфигурации из списка будут прочитаны. Если ни один из указанных файлов не существует, экземпляр [`ConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser) будет содержать пустой набор данных. Приложение, которое требует загрузки начальных значений из файла, должно загрузить необходимый файл или файлы с помощью [`read_file()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.read_file) перед вызовом [`read()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.read) для любых дополнительных файлов:703704```python705import configparser, os706707config = configparser.ConfigParser()708config.read_file(open('defaults.cfg'))709config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')],710 encoding='cp1250')711```712713Новое в версии 3.2: Параметр *encoding*. Ранее все файлы читались с использованием кодировки по умолчанию для [`open()`](https://python-all.ru/3.2/library/functions.html#open).714715#### `read_file(f, source=None)`716717Читает и разбирает данные конфигурации из *f*, который должен быть итерируемым объектом, возвращающим строки Unicode (например, файлы, открытые в текстовом режиме).718719Необязательный аргумент *source* указывает имя читаемого файла. Если он не задан и у *f* есть атрибут `name`, то он используется для *source*; по умолчанию – `'<???>'`.720721Новое в версии 3.2: Заменяет [`readfp()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.readfp).722723#### `read_string(string, source='<string>')`724725Разбирает данные конфигурации из строки.726727Необязательный аргумент *source* задаёт контекстно-зависимое имя переданной строки. Если он не указан, используется `'<string>'`. Обычно это должен быть путь файловой системы или URL.728729Новое в версии 3.2.730731#### `read_dict(dictionary, source='<dict>')`732733Загружает конфигурацию из любого объекта, который предоставляет dict-подобный метод `items()`. Ключи – имена разделов, значения – словари с ключами и значениями, которые должны присутствовать в разделе. Если используемый тип словаря сохраняет порядок, разделы и их ключи будут добавлены по порядку. Значения автоматически преобразуются в строки.734735Необязательный аргумент *source* задаёт контекстно-зависимое имя переданного словаря. Если не указан, используется `<dict>`.736737Этот метод можно использовать для копирования состояния между парсерами.738739Новое в версии 3.2.740741#### `get(section, option, *, raw=False, vars=None[, fallback])`742743Получает значение *option* для указанного *section*. Если передан *vars*, он должен быть словарём. Поиск *option* осуществляется в *vars* (если передан), *section* и *DEFAULTSECT* в указанном порядке. Если ключ не найден и передан *fallback*, он используется как запасное значение. В качестве значения *fallback* можно передать `None`.744745Все операции `'%'` интерполяции раскрываются в возвращаемых значениях, если только аргумент *raw* не равен true. Значения для ключей интерполяции ищутся так же, как и параметр.746747Изменено в версии 3.2: Аргументы *raw*, *vars* и *fallback* стали только ключевыми (keyword-only), чтобы защитить пользователей от попыток использовать третий аргумент как *fallback* (запасной) (особенно при использовании протокола отображения).748749#### `getint(section, option, *, raw=False, vars=None[, fallback])`750751Удобный метод, который приводит *параметр* в указанном *разделе* к целому числу. См. [`get()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.get) для пояснения *raw*, *vars* и *fallback*.752753#### `getfloat(section, option, *, raw=False, vars=None[, fallback])`754755Удобный метод, который приводит *параметр* в указанном *разделе* к числу с плавающей запятой. См. [`get()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.get) для пояснения *raw*, *vars* и *fallback*.756757#### `getboolean(section, option, *, raw=False, vars=None[, fallback])`758759Удобный метод, который приводит *параметр* в указанном *разделе* к булевому значению. Обратите внимание, что допустимыми значениями для параметра являются `'1'`, `'yes'`, `'true'` и `'on'`, что заставляет этот метод возвращать `True`, а `'0'`, `'no'`, `'false'` и `'off'`, что заставляет его возвращать `False`. Эти строковые значения проверяются без учёта регистра. Любое другое значение приведёт к возбуждению [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError). См. [`get()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.get) для пояснения *raw*, *vars* и *fallback*.760761#### `items(raw=False, vars=None)`762763#### `items(section, raw=False, vars=None)`764765Если *section* не указан, возвращает список пар *section\_name*, *section\_proxy*, включая DEFAULTSECT.766767В противном случае возвращает список пар *имя*, *значение* для параметров в указанном *разделе*. Необязательные аргументы имеют тот же смысл, что и для метода [`get()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.get).768769Изменено в версии 3.2: Элементы, присутствующие в *vars*, больше не отображаются в результате. Предыдущее поведение смешивало фактические параметры синтаксического анализатора с переменными, предоставленными для интерполяции.770771#### `set(section, option, value)`772773Если указанный раздел существует, устанавливает заданный параметр в указанное значение; в противном случае возбуждает [`NoSectionError`](https://python-all.ru/3.2/library/configparser.html#configparser.NoSectionError). *параметр* и *значение* должны быть строками; в противном случае возбуждается [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError).774775#### `write(fileobject, space_around_delimiters=True)`776777Записывает представление конфигурации в указанный [*файловый объект*](https://python-all.ru/3.2/glossary.html#term-file-object), который должен быть открыт в текстовом режиме (принимает строки). Это представление может быть проанализировано последующим вызовом [`read()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.read). Если *space\_around\_delimiters* равно true, разделители между ключами и значениями окружаются пробелами.778779#### `remove_option(section, option)`780781Удаляет указанный *параметр* из указанного *раздела*. Если раздел не существует, возбуждает [`NoSectionError`](https://python-all.ru/3.2/library/configparser.html#configparser.NoSectionError). Если параметр существовал и был удалён, возвращает [`True`](https://python-all.ru/3.2/library/constants.html#True); в противном случае возвращает [`False`](https://python-all.ru/3.2/library/constants.html#False).782783#### `remove_section(section)`784785Удаляет указанный *раздел* из конфигурации. Если раздел в действительности существовал, возвращает `True`. В противном случае возвращает `False`.786787#### `optionxform(option)`788789Преобразует имя параметра *option*, как оно найдено во входном файле или передано клиентским кодом, в форму, которая должна использоваться во внутренних структурах. Реализация по умолчанию возвращает версию *option* в нижнем регистре; подклассы могут переопределить это, или клиентский код может установить атрибут с таким именем на экземплярах, чтобы повлиять на это поведение.790791Вам не нужно создавать подкласс синтаксического анализатора, чтобы использовать этот метод, вы также можете установить его на экземпляре как функцию, которая принимает строковый аргумент и возвращает строку. Установка его в `str`, например, сделает имена параметров чувствительными к регистру:792793```python794cfgparser = ConfigParser()795cfgparser.optionxform = str796```797798Обратите внимание, что при чтении файлов конфигурации пробелы вокруг имён параметров удаляются до вызова [`optionxform()`](https://python-all.ru/3.2/library/configparser.html#configparser.optionxform).799800#### `readfp(fp, filename=None)`801802Устарело с версии 3.2: Вместо этого используйте [`read_file()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.read_file).803804Изменено в версии 3.2: [`readfp()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.readfp) теперь выполняет итерацию по *f* вместо вызова `f.readline()`.805806Для существующего кода, вызывающего [`readfp()`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser.readfp) с аргументами, которые не поддерживают итерацию, может быть использован следующий генератор в качестве обёртки вокруг файлоподобного объекта:807808```python809def readline_generator(f):810 line = f.readline()811 while line:812 yield line813 line = f.readline()814```815816Вместо `parser.readfp(f)` используйте `parser.read_file(readline_generator(f))`.817818#### `configparser.MAX_INTERPOLATION_DEPTH`819820Максимальная глубина рекурсивной интерполяции для `get()`, когда параметр *raw* имеет значение false. Это актуально только при использовании интерполяции по умолчанию *interpolation*.821822## 13.2.10. Объекты RawConfigParser823824#### `class configparser.RawConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT[, interpolation])`825826Устаревший вариант [`ConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser) с отключённой по умолчанию интерполяцией и небезопасными методами `add_section` и `set`.827828> **Примечание**829>830> Рекомендуется использовать [`ConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser), который проверяет типы значений при внутреннем хранении. Если интерполяция не нужна, можно использовать `ConfigParser(interpolation=None)`.831832#### `add_section(section)`833834Добавляет раздел с именем *раздел* в экземпляр. Если раздел с указанным именем уже существует, возбуждается [`DuplicateSectionError`](https://python-all.ru/3.2/library/configparser.html#configparser.DuplicateSectionError). Если передано имя *раздел по умолчанию*, возбуждается [`ValueError`](https://python-all.ru/3.2/library/exceptions.html#ValueError).835836Тип *раздела* не проверяется, что позволяет пользователям создавать нестроковые именованные разделы. Такое поведение не поддерживается и может вызывать внутренние ошибки.837838#### `set(section, option, value)`839840Если указанный раздел существует, устанавливает заданную опцию в указанное значение; в противном случае возбуждает [`NoSectionError`](https://python-all.ru/3.2/library/configparser.html#configparser.NoSectionError). Хотя можно использовать [`RawConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.RawConfigParser) (или [`ConfigParser`](https://python-all.ru/3.2/library/configparser.html#configparser.ConfigParser) с параметром *raw*, установленным в true) для *внутреннего* хранения нестроковых значений, полная функциональность (включая интерполяцию и вывод в файлы) может быть достигнута только с использованием строковых значений.841842Этот метод позволяет пользователям присваивать нестроковые значения ключам внутри. Такое поведение не поддерживается и приведет к ошибкам при попытке записи в файл или получении значения в несыром режиме. **Используйте API протокола отображения**, который не допускает таких присваиваний.843844## 13.2.11. Исключения845846#### `exception configparser.Error`847848Базовый класс для всех остальных исключений [`configparser`](https://python-all.ru/3.2/library/configparser.html#module-configparser).849850#### `exception configparser.NoSectionError`851852Исключение, возбуждаемое, когда указанный раздел не найден.853854#### `exception configparser.DuplicateSectionError`855856Исключение возбуждается, если `add_section()` вызывается с именем раздела, который уже существует, или в строгих анализаторах, когда раздел встречается более одного раза в одном входном файле, строке или словаре.857858Новое в версии 3.2: Добавлены необязательные атрибуты и аргументы `source` и `lineno` для [`__init__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__init__).859860#### `exception configparser.DuplicateOptionError`861862Исключение, возбуждаемое строгими парсерами, если один параметр встречается дважды при чтении из одного файла, строки или словаря. Это позволяет отлавливать опечатки и ошибки, связанные с регистром символов: например, в словаре может быть два ключа, представляющих один и тот же конфигурационный ключ, регистр которого не учитывается.863864#### `exception configparser.NoOptionError`865866Исключение, возбуждаемое, когда указанный параметр не найден в указанном разделе.867868#### `exception configparser.InterpolationError`869870Базовый класс для исключений, возбуждаемых при возникновении проблем во время выполнения строковой интерполяции.871872#### `exception configparser.InterpolationDepthError`873874Исключение возбуждается, когда строковая интерполяция не может быть завершена, поскольку количество итераций превышает [`MAX_INTERPOLATION_DEPTH`](https://python-all.ru/3.2/library/configparser.html#configparser.MAX_INTERPOLATION_DEPTH). Подкласс [`InterpolationError`](https://python-all.ru/3.2/library/configparser.html#configparser.InterpolationError).875876#### `exception configparser.InterpolationMissingOptionError`877878Исключение возбуждается, когда опция, на которую ссылается значение, не существует. Подкласс [`InterpolationError`](https://python-all.ru/3.2/library/configparser.html#configparser.InterpolationError).879880#### `exception configparser.InterpolationSyntaxError`881882Исключение возбуждается, когда исходный текст, в который вносятся подстановки, не соответствует требуемому синтаксису. Подкласс [`InterpolationError`](https://python-all.ru/3.2/library/configparser.html#configparser.InterpolationError).883884#### `exception configparser.MissingSectionHeaderError`885886Исключение, возбуждаемое при попытке разобрать файл, не содержащий заголовков разделов.887888#### `exception configparser.ParsingError`889890Исключение, возникающее при ошибках во время разбора файла.891892Изменено в версии 3.2: Атрибут `filename` и аргумент [`__init__()`](https://python-all.ru/3.2/reference/datamodel.html#object.__init__) были переименованы в `source` для согласованности.893894Сноски895896| \[1\] | *([1](https://python-all.ru/3.2/library/configparser.html#id1), [2](https://python-all.ru/3.2/library/configparser.html#id2), [3](https://python-all.ru/3.2/library/configparser.html#id3), [4](https://python-all.ru/3.2/library/configparser.html#id4), [5](https://python-all.ru/3.2/library/configparser.html#id5), [6](https://python-all.ru/3.2/library/configparser.html#id6), [7](https://python-all.ru/3.2/library/configparser.html#id7), [8](https://python-all.ru/3.2/library/configparser.html#id8), [9](https://python-all.ru/3.2/library/configparser.html#id9))* Парсеры конфигурационных файлов допускают широкую настройку. Если вам интересно изменить поведение, описанное в сноске, обратитесь к разделу [Настройка поведения парсера](https://python-all.ru/3.2/library/configparser.html#customizing-parser-behaviour). |897| --- | --- |898