我正在尝试创建一个方法,将多个参数化配置文件部分合并为一个。
每个部分都可以具有特定的部分参数,并包含配置变量的有效负载。有几个部分的例子:
[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) 通用算法是:
有一种快速而优雅的方法吗?
答案 0 :(得分:0)
这将按顺序合并它们,最后一个是最重要的:
parameters = {}
parameters.update(sections[0])
parameters.update(sections[6])
parameters.update(sections[1])
parameters.update(sections[3])
parameters.update(sections[5])
parameters.update(sections[4])
parameters.update(sections[7])
我不清楚你对“合并标准”的意思。可能你的意思是某些值比其他值更重要,但除了查看每个参数本身之外没有好的方法。
更新
不,没有快速而优雅的方式来做你想做的事。
你需要先对你的部分进行排序,看看它们与你的合并标准的匹配程度,它们需要是一个键和值列表(OrderedDict有效,但字典或元组列表也可以工作)。由于您关心匹配时参数的独特性,因此您需要将该部分的参数数量作为排序键的一部分。
然后您需要按顺序拍摄这些部分,然后合并它们。真的没有解决方法。 :)
然而,可能有快速而优雅的方法来解决您的用例,但我们不知道您没有告诉我们您为什么这样做。也可能值得问一个问题。