Посты с тэгом configparser


Соблюдаем порядок секций при работе с конфиг файлом

Столкнулся с весьма забавной проблемой при работе с конфиг файлами, используя стандартную библиотеку ConfigParser. Дело в том, что до версии 2.7 эта библиотека не соблюдает порядок в котором расположены секции в конфиг файле, потому что хранит их в обыкновенном dict объекте. В версии же 2.7 библиотека использует добавленный в collections класс OrderedDict и никаких проблем с порядком нет.

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

Решение весьма простое, использовать dict_type при инициализации парсера, например так:

from ConfigParser import SafeConfigParser

from django.utils.datastructures 


Использование __setattr_.

Очень часто использую файл настроек для скрипта посредством модуля ConfigParser. И как-то немножко поднадоело писать в несколько строк каждый раз:

key = config.get("Basic","Key")
ns1 = config.get("Domains","NS1")
ns2 = config.get("Domains","NS2")

Короче, захотел я, чтобы доступ к настройкам выглядел примерно так: ns1 = config.Domains['ns1'], когда надо обратился к ней, вне зависимости от того, сколько настроек в файле. Самая хитрость – это сделать свойством класса секцию файла настроек. Именно для этого нужна функция __setattr__. Вот так у меня всё в итоге получилось:

class ConfigDict(object):
    def __init__(self,path):
        config = ConfigParser.RawConfigParser()
        config.read(path)
        for section in config.sections():
            dct = {}
            for option in config.options(section):
                dct[option] = config.get(section,option)
            self.__setattr__(section,dct)



Использование __setattr_.

Очень часто использую файл настроек для скрипта посредством модуля ConfigParser. И как-то немножко поднадоело писать в несколько строк каждый раз:

key = config.get("Basic","Key")
ns1 = config.get("Domains","NS1")
ns2 = config.get("Domains","NS2")

Короче, захотел я, чтобы доступ к настройкам выглядел примерно так: ns1 = config.Domains['ns1'], когда надо обратился к ней, вне зависимости от того, сколько настроек в файле. Самая хитрость – это сделать свойством класса секцию файла настроек. Именно для этого нужна функция __setattr__. Вот так у меня всё в итоге получилось:

class ConfigDict(object):
    def __init__(self,path):
        config = ConfigParser.RawConfigParser()
        config.read(path)
        for section in config.sections():
            dct = {}
            for option in config.options(section):
                dct[option] = config.get(section,option)
            self.__setattr__(section,dct)