Сопоставление конфигурации с классами в PythonPython

Программы на Python
Anonymous
Сопоставление конфигурации с классами в Python

Сообщение Anonymous »

Я пишу приложение со сложной конфигурацией, обрабатываемое на нескольких уровнях (разработка, производство и т. д.) и с использованием нескольких источников (файлы JSON, переменные среды и т. д.). Эти два требования выполняются большинством библиотек конфигурации (например, dynaconf).
Чтобы отделить мое приложение от библиотеки конфигурации, я хотел бы, чтобы к его значениям можно было получить доступ через внедрение зависимостей/идентификаторы, похоже на шаблон опций .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"]
где @Option(section) возвращает декоратор класса, который устанавливает любой атрибут класса в свойство, возвращающее ключ внутри раздела, который имеет то же имя, что и attribute.
Как мне сделать такой декоратор, и хорошо ли это? идея? Существуют ли библиотеки, которые уже это делают?
Примечания по реализации:
  • Я рассматриваю возможность использования @Options вести себя аналогично @dataclass (т. е. расширять его). Это позволит проводить различие между полями (атрибутами, автоматически сопоставляемыми с конфигурацией) и псевдополями (атрибутами, которые не сопоставляются).
  • Было бы полезно предоставить способ определения пользовательской логики для сопоставления атрибутов с ключами конфигурации (переопределяя поиск по умолчанию по имени атрибута).


Подробнее здесь: https://stackoverflow.com/questions/790 ... -in-python

Вернуться в «Python»