Протокол доступа к словарям Python - это функциональность, которая позволяет использовать пользовательские объекты, как если бы они были словарями. В случае configparser
реализация интерфейса отображения использует нотацию анализатора parser['section']['option']
.
В частности, parser['section']
возвращает для данных раздела в парсере. Это означает, что значения не копируются, а извлекаются из исходного анализатора по запросу. Еще более важно то, что когда значения изменяются в прокси раздела, они фактически видоизменяются в исходном парсере.
Объекты модуля configparser
ведут себя как можно ближе к реальным словарям. Однако есть несколько различий, которые следует учитывать:
По умолчанию все ключи key
в разделах [section]
доступны без учета регистра. Например для секции в парсере ['section']
выдает только имена ключей секции, заданные configparser.optionxform()
. Это означает, что ключи в нижнем регистре по умолчанию. В то же время для раздела, содержащего ключ a
, оба выражения возвращают True
:
>>> "a" in parser["section"] # True >>> "A" in parser["section"] # True
Все разделы также включают значения DEFAULTSECT
, это означает, что метод parser.clear()
не может оставить раздел пустым. Это происходит потому, что значения по умолчанию не могут быть удалены из раздела, потому что технически их там нет. Если они переопределены, удаление приводит к тому, что значение по умолчанию снова становится видимым. Попытка удалить значение по умолчанию вызывает исключение KeyError
.
DEFAULTSECT
не может быть удален из анализатора:
ValueError
,parser.clear()
оставляет его без изменений,parser.popitem()
никогда его не возвращает.parser.get(section, option, ** kwargs)
- второй аргумент не является запасным значением. Однако обратите внимание, что методы parser.get()
уровня раздела совместимы как с протоколом словаря, так и с классическим API-интерфейсом модуля configparser
.
parser.items()
совместим с протоколом словаря dict
, возвращает список пар кортежей (section_name, section_proxy)
, включая DEFAULTSECT
. Однако этот метод также можно вызывать с аргументами: parser.items(section, raw, vars)
. Последний вызов возвращает список параметров, пар значений для указанного раздела со всеми интерполяциями, если не указано raw=True
.
Протокол словаря dict
Python реализован поверх существующего устаревшего API, так что подклассы, переопределяющие исходный интерфейс, должны по-прежнему работать в соответствии с ожиданиями.