воскресенье, 13 марта 2011 г.

Использование __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)


Используется это вот так:


def main():
conf = ConfigDict("settings.cfg")
threads = conf.Basic['threads']
ns1 = conf.Domains['ns1']
if __name__ == '__main__':
main()

Ну и сам файл настроек settings.cfg:

[Basic]
THREADS = 1 ; потоки
[Domains]
NS1 = ns1.0adz.com

4 комментария:

  1. О, Коль, спасибо тебе за этот клёвый сниппет!!
    Очень и очень кстати. А то замаялся уже настраивать скрипт в скрипте =))

    ОтветитьУдалить
  2. Откройте для себя ConfigObject (http://pypi.python.org/pypi?%3Aaction=search&term=ConfigObject&submit=search)
    Описалово здесь :http://www.gawel.org/docs/ConfigObject/index.html

    ОтветитьУдалить
  3. А его можно как-нибудь выдрать одним-двумя py-файлами? Просто не очень удобно другим людям объяснять как инсталлить Питон-модули.

    ОтветитьУдалить
  4. Как раз мучаюсь с конфигом, а это именно то что нужно! thx!

    ОтветитьУдалить