2010-12-19 55 views
0

我试图创建一个方法来将多个参数化配置文件部分合并为一个。通过其参数搜索和合并对象

每个部分都可以具有特定的部分参数并包含配置变量的有效负载。有几个章节的例子:

[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... 

(所有参数和VAR分配在运行时,不静态分配) 第参数可有所不同,有些可能不存在。

我需要的是一个算法来选择和合并配置部分(其变量有效载荷)为一个特定的部分参数值。

例如,我有节的列表:

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. 搜索部仅具有标准的第一参数和合并它们
  2. 重复步骤1中的其它参数的标准
  3. 搜索部分匹配的标准...... 两个参数等等...

是否有一个快速和优雅的方式来做到这一点?

+1

'{'x'='y'}'是无效的Python语法。要指定一个字典的键值对,你需要'{'x':'y'}'。 – 2010-12-19 12:27:17

+2

另外,字典**没有订单**,所以你不能说“合并的顺序很重要” - 无论你将它们合并到什么顺序中,所产生的“变量”将是相同。 – 2010-12-19 12:29:06

+1

是的,我的语法不好。 “合并顺序很重要”我的意思是section.merge()调用的顺序很重要(因为在某些情况下,部分变量会被覆盖)。现在我看到'标准'必须是OrderedDict。 – RedRampage 2010-12-19 13:24:10

回答

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工作,但字典或元组列表也可以)。由于您关心匹配时参数的唯一性,因此您需要将该部分的参数数作为排序键的一部分。

然后,您需要按照该顺序进行操作并合并它们。没有解决方法,真的。 :)

然而,可能有快速和优雅的方式来解决你的用例,但我们不知道你不告诉我们为什么你这样做。也许值得提一个关于这个问题的问题。

+0

好吧,我试图澄清主帖中的一些细节。 – RedRampage 2010-12-19 15:20:17

+0

@RedRampage:更新。 – 2010-12-19 15:40:17

+0

用例是某种配置节过载。某些自定义参数(例如系统语言或软件版本)是在运行时确定的,在解析配置文件时必须牢记在心。默认情况下,程序将使用无参数部分,但如果配置文件包含特定于这些自定义参数的部分,则默认值必须由其内容覆盖。 – RedRampage 2010-12-19 16:07:48