Я пытаюсь создать метод для объединения нескольких разделов параметризованного файла конфигурации в один.
Каждый раздел может иметь определенные параметры раздела и содержать полезную нагрузку переменных конфигурации. Есть примеры нескольких разделов:
[MySection]
foo = defaultbar
[MySection|color=red|shape=circle]
foo = bar
variable = value
[MySection|shape=circle]
otherfoo = otherbar
foo = anotherbar
Эти секции представлены следующим классом:
class Section():
# All values here are parsed from config file
name = "MySection"
# This is a section specific parameters
params = {'color': 'red',
'share': 'circle',
'weight': 'ton'}
# This is section variables payload
vars = {'foo': 'bar',
'variable': 'value'}
def merge(self, section):
"""Merges current section vars with vars of given one"""
# ...code here...
(все параметры и переменные назначаются во время выполнения, а не статически)
Параметры секции могут отличаться, некоторые могут отсутствовать.
Мне нужен алгоритм, позволяющий выбирать и объединять разделы конфигурации (их переменные полезные нагрузки) в один с помощью значений параметров конкретного раздела.
Например, у меня есть список разделов:
sections[0].params = {'color': 'blue'}
sections[1].params = {'shape': 'circle'}
sections[2].params = {'color': 'red'}
sections[3].params = {'shape': 'circle'}
sections[4].params = {'color': 'blue',
'shape': 'circle'}
sections[5].params = {'weight': 'ton'}
sections[6].params = {'color': 'blue'}
sections[7].params = {'color': 'blue',
'shape': 'circle',
'weight': 'ton'}
Критериями выбора и объединения (определенными во время выполнения) является OrderedDict, например:
criteria = {'color': 'blue',
'shape': 'circle',
'weight': 'ton'}
Теперь мне нужно поискать в списке разделов, чтобы найти те, которые хотя бы частично соответствуют этому критерию. Разделы, которые имеют больше совпадений параметров, должны быть объединены позже.
С заданными критериями разделы будут объединены в следующем порядке:
sections[0] + sections[6] + sections[1] + sections[3] + sections[5] +
sections[4] + sections[7]
Порядок слияния важен, возможно, за исключением тех же разделов параметров (например, 0 и 6, 1 и 3)
Общий алгоритм:
- Поиск раздела, имеющего только первый параметр критериев, и объединение их
- Повторите шаг 1 для других параметров в критериях
- Поиск раздела, который соответствует двум параметрам критериев ...
и так далее ...
Есть ли быстрый и элегантный способ сделать это?