Чтобы отделить мое приложение от библиотеки конфигурации, я хотел бы, чтобы к его значениям можно было получить доступ через внедрение зависимостей/идентификаторы, похоже на шаблон опций .NET; т. е. я хотел бы реализовать что-то похожее на следующее:
Код: Выделить всё
#settings.toml
[default]
[default.section1]
a = "foo"
b = "bar"
[default.section2]
x = 1
y = 2
[dev]
[dev.section1]
a = "foodev"
[prod]
[prod.section2]
y = -2
Код: Выделить всё
#test.py
#provided by the configuration library, returns whole configuration as a flat dict with keys in the format "[section_name].[key]"
#settings = get_config("settings.toml", ...other sources...)
@Option("section1")
class Section1Options:
a: str
b: str
@Option("section2")
class Section2Options:
x: int
y: int
class MyService:
def __init__(self, opts : Section2Options): #option injection
self.x = opts .x
self.z = opts .x + opts .y
#equivalent to:
#self.x = settings["section2.x"]
#self.z = settings["section2.x"] + settings["section2.y"]
Как мне сделать такой декоратор, и хорошо ли это? идея? Существуют ли библиотеки, которые уже это делают?
Примечания по реализации:
- Я рассматриваю возможность использования @Options вести себя аналогично @dataclass (т. е. расширять его). Это позволит проводить различие между полями (атрибутами, автоматически сопоставляемыми с конфигурацией) и псевдополями (атрибутами, которые не сопоставляются).
- Было бы полезно предоставить способ определения пользовательской логики для сопоставления атрибутов с ключами конфигурации (переопределяя поиск по умолчанию по имени атрибута).
Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python