Сообщить об ошибке.

Настройка ConfigParser в Python

Настройка парсера файлов конфигурации

Вариантов формата INI-файлов почти столько же, сколько есть использующих его приложений. Модуль configparser имеет поддержку разумно-большого набора доступных стилей INI-файлов. Функциональность по умолчанию в основном определяется историческим прошлым и вероятно, что вы захотите настроить некоторые функции.

Наиболее распространенный способ изменить работу анализатора конфигурации - это использовать параметры конструктора __init__() класса configparser.ConfigParser().

Аргумент defaults=None:

Опция defaults принимает словарь - пары key: value, которые будут изначально помещены в раздел DEFAULT. Это обеспечивает элегантный способ поддержки кратких файлов конфигурации, в которых не указаны значения, совпадающие с задокументированными по умолчанию.

Подсказка: если необходимо указать значения по умолчанию для определенного раздела, используйте метод config.read_dict(), прежде чем читать фактический файл.

Аргумент dict_type=dict:

Параметр dict_type оказывает большое влияние на поддержку протокола словаря Python и внешний вид записанных файлов конфигурации. В стандартном словаре каждый раздел хранится в том порядке, в котором они были добавлены в анализатор. То же самое касается разделов.

Альтернативный тип словаря может использоваться, например, для сортировки разделов и опций при обратной записи.

Обратите внимание: есть способы добавить набор пар key: value в одной операции. Когда используется обычный словарь, то в этих операциях порядок ключей будет упорядочен.

>>> parser = configparser.ConfigParser()
   >>> parser.read_dict({'section1': {'key1': 'value1',
   ...                                'key2': 'value2',
   ...                                'key3': 'value3'},
   ...                   'section2': {'keyA': 'valueA',
   ...                                'keyB': 'valueB',
   ...                                'keyC': 'valueC'},
   ...                   'section3': {'foo': 'x',
   ...                                'bar': 'y',
   ...                                'baz': 'z'}
   ... })
   >>> parser.sections()
   # ['section1', 'section2', 'section3']
   >>> [option for option in parser['section3']]
   # ['foo', 'bar', 'baz']
Аргумент allow_no_value=False:

Известно, что некоторые файлы конфигурации содержат настройки без значений, но в остальном они соответствуют синтаксису, поддерживаемому configparser. Параметр allow_no_value для конструктора может использоваться для указания того, что такие значения должны быть приняты:

>>> import configparser
   >>> sample_config = """
   ... [mysqld]
   ...   user = mysql
   ...   pid-file = /var/run/mysqld/mysqld.pid
   ...   skip-external-locking
   ...   old_passwords = 1
   ...   skip-bdb
   ...   # we don't need ACID today
   ...   skip-innodb
   ... """
   >>> config = configparser.ConfigParser(allow_no_value=True)
   >>> config.read_string(sample_config)
   # Настройки со значениями обрабатываются как и раньше:
   >>> config["mysqld"]["user"]
   # 'mysql'

   # Настройки без значений обеспечивают None:
   >>> config["mysqld"]["skip-bdb"]

   # Настройки, которые не указаны, 
   # по-прежнему вызывают ошибку:
   >>> config["mysqld"]["does-not-exist"]
   Traceback (most recent call last):
   ...
   KeyError: 'does-not-exist'
Аргумент delimiters=('=', ':'):

Разделители delimiters - это подстроки, которые отделяют ключи от значений в разделе. Первое вхождение разделительной подстроки в строке считается разделителем. Это означает, что значения, но не ключи могут содержать данные разделители.

Смотрите также аргумент space_around_delimiters для метода config.write().

Аргумент comment_prefixes=('#', ';')
Аргумент inline_comment_prefixes=None:

Префиксы комментариев - это строки, которые указывают на начало действительного комментария в файле конфигурации. Аргумент comment_prefixes используются только в остальных пустых строках (с отступом), тогда как inline_comment_prefixes можно использовать после каждого допустимого значения, например имен разделов, параметров и пустых строк. По умолчанию встроенные комментарии отключены символы '#' и ';' используются в качестве префиксов для комментариев всей строки.

Обратите внимание, что парсеры конфигурации не поддерживают экранирование префиксов комментариев, поэтому использование inline_comment_prefixes может помешать пользователям указывать значения параметров с символами, используемыми в качестве префиксов комментариев. В случае сомнений избегайте установки inline_comment_prefixes. В любом случае единственный способ сохранить префиксные символы комментария в начале строки в многострочных значениях - это интерполировать префикс, например:

>>> from configparser import ConfigParser, ExtendedInterpolation
>>> parser = ConfigParser(interpolation=ExtendedInterpolation())
>>> # the default BasicInterpolation could be used as well
>>> parser.read_string("""
... [DEFAULT]
... hash = #
...
... [hashes]
... shebang =
...   ${hash}!/usr/bin/env python
...   ${hash} -*- coding: utf-8 -*-
...
... extensions =
...   enabled_extension
...   another_extension
...   #disabled_by_comment
...   yet_another_extension
...
... interpolation not necessary = if # is not at line start
... even in multiline values = line #1
...   line #2
...   line #3
... """)
>>> print(parser['hashes']['shebang'])

#!/usr/bin/env python
# -*- coding: utf-8 -*-
>>> print(parser['hashes']['extensions'])

# enabled_extension
# another_extension
# yet_another_extension
>>> print(parser['hashes']['interpolation not necessary'])
# if # is not at line start
>>> print(parser['hashes']['even in multiline values'])
# line #1
# line #2
# line #3
Аргумент strict=True:

Если установлено значение True, синтаксический анализатор не будет разрешать дублирование каких-либо разделов или параметров при чтении из одного источника, используя методы config.read_file(), config.read_string() или config.read_dict(). Рекомендуется использовать строгие парсеры в новых приложениях.

Аргумент empty_lines_in_values=True:

В синтаксическом анализаторе значения могут занимать несколько строк, если они имеют отступ больше, чем ключ, который их содержит. По умолчанию парсеры также позволяют пустым строкам быть частью значений. В то же время, ключи могут быть произвольно смещены, чтобы улучшить читаемость. В результате, когда файлы конфигурации становятся большими и сложными, пользователю легко потерять структуру файла. Взять например:

[Section]
key = multiline
  value with a gotcha

 this = is still a part of the multiline value of 'key'

Это может быть особенно проблематичным для пользователя, чтобы увидеть, использует ли он пропорциональный шрифт для редактирования файла. Вот почему, когда приложению не нужны значения с пустыми строками, необходимо предусмотреть возможность их запрета. Это сделает пустые строки каждый раз разделенными ключами. В приведенном выше примере он выдаст два ключа: key и this.

Аргумент default_section=configparser.DEFAULTSECT:

Соглашение о предоставлении специального раздела значений по умолчанию для других разделов или целей интерполяции является мощной концепцией этой библиотеки, позволяющей пользователям создавать сложные декларативные конфигурации.

Этот раздел обычно называется DEFAULT, но его можно настроить так, чтобы он указывал на любое другое допустимое имя раздела. Некоторые типичные значения включают в себя: 'general' or 'common'. Предоставленное имя используется для распознавания разделов по умолчанию при чтении из любого источника и используется при записи конфигурации обратно в файл. Его текущее значение может быть получено с помощью атрибута parser_instance.default_section и может быть изменено во время выполнения, то есть для преобразования файлов из одного формата в другой.

Аргумент interpolation=configparser.BasicInterpolation():

Поведение интерполяции может быть настроено путем предоставления специального обработчика через аргумент интерполяции. Ни один из них не может быть использован для полного отключения интерполяции, configparser.ExtendedInterpolation() предоставляет более продвинутый вариант, основанный на Buildout.

Аргумент converters={}:

Синтаксические анализаторы предоставляют методы получения значений параметров, которые выполняют преобразование типов. По умолчанию реализованы config.getint(), config.getfloat() и config.getboolean(). Если желательно обрабатывать другие типы, то пользователи могут определить их в подклассе или передать словарь, в котором каждый ключ является именем преобразователя, а каждое значение - вызываемым объектом, реализующим указанное преобразование. Например если передать converters={'decimal': decimal.Decimal}, то это добавит новый метод config.getdecimal() как для объекта парсера, так и для всех прокси секций. Другими словами, можно будет написать как

config.getdecimal('section', 'key', fallback=0) 
# или
config['section'].getdecimal('key', 0).