Python: достойный формат файла конфигурации

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

cachedir = /var/cache
mail_to = [email protected]

job {
   name = my-media
   frequency = 1 day
   source {
      from = /home/michael/Images

   source { }
   source { }       
}

job { }

Я был бы счастлив с чем-то, использующим значащие пробелы.

JSON требует слишком много явных правил синтаксиса (цитирование, запятые и т. д.). YAML на самом деле довольно хорош, но требует, чтобы задания были определены как список YAML, который я считаю немного неудобным в использовании.


person miracle2k    schedule 09.06.2010    source источник


Ответы (5)


Я думаю, что YAML отлично подходит для этой цели:

jobs:
 - name: my-media
   ...

 - name: something else
   ...

Или, как дикт вместо списка:

jobs:
  my-media:
    frequency: 1 day
    ...
  something-else:
    frequency: 2 day
    ...

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

person Eli Bendersky    schedule 09.06.2010
comment
Спасибо за идею с диктофоном. Я бы предпочел этот синтаксис списку, не рассматривал такой подход. - person miracle2k; 09.06.2010

Поскольку встроенный модуль Python configparser, похоже, не поддерживает вложенные разделы, я бы сначала попробовал ConfigObj . (См. вводное руководство здесь). Согласно его домашней странице, это набор функций, о которых стоит упомянуть:

  • Вложенные разделы (подразделы), на любой уровень
  • Список значений
  • Несколько строковых значений
  • Интерполяция строк (подстановка)
  • Integrated with a powerful validation system
    • including automatic type checking/conversion
    • повторяющиеся разделы
    • и разрешить значения по умолчанию
  • При записи файлов конфигурации ConfigObj сохраняет все комментарии и порядок элементов и разделов.
  • Множество полезных методов и опций для работы с конфигурационными файлами (например, метод перезагрузки)
  • Полная поддержка Юникода

ConfigObj используется Bazaar, Trac, IPython, matplotlib и многими другими крупными проектами Python. , так что мне он кажется довольно зрелым и стабильным (хотя сам я им никогда не пользовался).

person Tamás    schedule 09.06.2010

Я думаю, вам следует проверить библиотеку libconfig http://www.hyperrealm.com/libconfig/. Для него должны быть где-то привязки python.

Другое решение — использовать формат json, который уже предоставлен самим python. Найдите документацию для модуля JSON.

person Zuljin    schedule 09.06.2010

Зачем изобретать велосипед? Вы можете использовать:

http://docs.python.org/library/configparser.html

person W Devauld    schedule 09.06.2010
comment
Configparser не поддерживает повторяющиеся структуры (ну, не так просто) - person Rabarberski; 12.07.2010

Вы также можете использовать Jsonnet, если ваши потребности превышают эти другие варианты. Jsonnet — это расширение JSON, которое, на первый взгляд, добавляет комментарии, упрощает правила использования запятых и избавляет от необходимости так много цитировать. Но если вы посмотрите глубже, вы увидите, что он действительно предоставляет полнофункциональный язык программирования и поддерживает расширение шаблона с помощью миксинов, импорта файлов и т. д. Для него существует привязка Python, но его фактическая реализация — C++.

person Dave Cunningham    schedule 09.09.2014