Столкнулся с задачей, и хочется решить ее собственным велосипедом, но может быть есть уже готовые решения? Хочется чтобы значение опций из конфигурации могло бы быть разным, в зависимости от контекста.
На примере вебсервера поясню. У нас есть запрос, и мы хотим знать значение конфигурационной опции 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 - один из более-менее подходящих, но я не уверен, что там это делается внутри конфига, возможно логика в самом апаче)