xenon
@xenon
Too drunk to fsck

Существуют ли модули для работы с контекстными конфигами?

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

На примере вебсервера поясню. У нас есть запрос, и мы хотим знать значение конфигурационной опции MyOption для его обработки. Мы ее можем (используя какую-нибудь готовую или самописную библиотеку) получить как-то вроде:
value = Config.get("MyOption")

Но хочется, чтобы она зависела от контекста, например:
context = None
value = Config.get("MyOption", context)  # default value e.g. 0


Но при этом:
context = {'virtualhost': 'example.com', 'remote_addr': '1.2.3.4', 'path': '/'}
value = Config.get("MyOption", context)  # Specific value, e.g. 1

context = {'virtualhost': 'example.com', 'remote_addr': '5.6.7.8', 'path': '/images/myimage.jpg'}
value = Config.get("MyOption", context)  # Other specific value, e.g. 200


А конфиг, соответственно, в простом случае будет выглядеть просто как MyOption=0, а в сложном - как вложенные структуры, Например, как-нибудь так:
virtualhost=example.com {
  MyOption=0
  remote_addr in ['1.2.3.4', '5.6.7.8'] {
    MyOption=1
    path='*.jpg' {
      MyOption=200
    } # end of path
  } # end of remote_addr
} # end of virtualhost


То есть, заполняем контекст множеством переменных, запрашиваем значение и получаем его, все в пару строчек, а насколько сложный будет конфиг - мы в коде не думаем. Пользователь сам может начать с простого конфига (MyOption=0) и усложнять сколько надо.

Есть ли какие-то готовые модули (Python) для этой цели? Или для других языков (чтобы взять за образец).
Есть ли какой-то удобный унифицированный формат для такого рода конфигов? Может быть есть примеры ПО у которых подобный функционал есть (вот Apache - один из более-менее подходящих, но я не уверен, что там это делается внутри конфига, возможно логика в самом апаче)
  • Вопрос задан
  • 51 просмотр
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы