制作一个动态变量集

问题描述:

我正在尝试组合一个具有“级别”概念的工具。 每个'级别'都有一组变量,这些变量需要用来支持我想要达到的特定于每个级别的活动。制作一个动态变量集

我已经写了一个硬编码的版本,可以在某种程度上起作用,但是它仅限于硬编码的层数。这让我感到必须有写本功能等都可以动态生成的水平瓦尔的巧妙方式:

def levelVarsGetter(level): 
    if level == 1: 
     levelDict = {'URLRegEx':baseDict['L1Regex'], 'titleRegEx':baseDict['L1TitleRegex'], 'buildPortion':baseDict['L1buildPortion'], 'levelParser':'level_1'} 
    elif level ==2: 
     levelDict = {'URLRegEx':baseDict['L2Regex'], 'titleRegEx':baseDict['L2TitleRegex'], 'buildPortion':baseDict['L2buildPortion'], 'levelParser':'level_2'} 
    elif level ==3: 
     levelDict = {'URLRegEx':baseDict['L3Regex'], 'titleRegEx':baseDict['L3TitleRegex'], 'buildPortion':baseDict['L3buildPortion'], 'levelParser':'level_3'} 
    elif level ==4: 
     levelDict = {'URLRegEx':baseDict['L4Regex'], 'titleRegEx':baseDict['L4TitleRegex'], 'buildPortion':baseDict['L4buildPortion'], 'levelParser':'level_4'} 
    elif level ==5: 
     levelDict = {'URLRegEx':baseDict['L5Regex'], 'titleRegEx':baseDict['L5TitleRegex'], 'buildPortion':baseDict['L5buildPortion'], 'levelParser':'level_5'} 
    return levelDict 

所有在字典的增值经销商在初始化FUNC手工输入。如有需要,标签可以更改。

的情况下,参考代码:

for x in xrange (1, baseDict['numberOfLevels']+1): 
    links=[] 
    levelDict= levelVarsGetter(x) 
    URLRegEx = levelDict['URLRegEx'] 
    titleRegEx = levelDict['titleRegEx'] 
    buildPortion = levelDict['buildPortion'] 
    level = levelDict['levelParser'] 
    go = siteParser() 

你可能只是做:

def levelVarsGetter(l): 
    return {'URLRegEx': baseDict['L%dRegex' % l], 
      'titleRegEx': baseDict['L%dTitleRegex' % l], 
      'buildPortion': baseDict['L%dbuildPortion' % l], 
      'levelParser': 'level_%d' % l} 

不过,我怀疑你的数据结构应该进行不同的设计。无论是存储在baseDict可以改为存储在首先由平键,然后按类型字典,像

{1: {"Regex": ..., "TitleRegex": ..., "buildPortion": ...}, 
2: {"Regex": ..., "TitleRegex": ..., "buildPortion": ...}... 

如果你的水平是连续的(不跳号),你应该让他们作为清单:

levels = [{"Regex": ..., "TitleRegex": ..., "buildPortion": ...}, 
      {"Regex": ..., "TitleRegex": ..., "buildPortion": ...}... 

(但请注意,你必须访问它levels[0]拿到1级)。

事实上,最好的设计可能是拥有一个名为Level的类,其属性为regex,title_regex等。这会让Level类也包含用于常见任务的方法。例如:

class Level: 
    def __init__(self, url_regex, title_regex, build_portion): 
     self.url_regex = url_regex 
     self.title_regex = title_regex 
     self.build_portion = build_portion 

    def method1(self): 
     """use build_portion to do something""" 
     self.build_portion.do_something() 

    def method2(self): 
     """use title_regex and url_regex to do something else""" 
     x = self.title_regex + self.url_regex 
     x.do_something_else() 
+0

除非他将有数十或数百个动态输入和随机访问级别,或者他的水平数必须是不连续的,这似乎是一个列表,甚至元组是外一个更好的结构外壳比字典。 –

+0

@ sr2222:我同意,除了我不确定它是顺序的。 (即使这些项目是随机访问的,列表仍然更好)。 –

+1

另外,你每次访问同一级别的关卡数据时都不会构建全新的字典。 –

是否有一个原因,你不能只是把这个列表中,并使用该列表的indeces当你的水平的数字?例如:

levels = [{'URLRegEx' : 'l1url', 'titleRegEx' : 'l1title', 'buildPortion' : 'l1build'}, 
      {'URLRegEx' : 'l2url', 'titleRegEx' : 'l2title', 'buildPortion' : 'l2build'}, 
      ...] 
+0

我可以做,但这仍然会导致一个硬编码集,而不是一个动态的? –

+0

没有更多的硬编码,那么你的'baseDict'。 –

+0

的确,但重点是要从硬编码版本中获得出路,并创建一个可扩展到n级的动态版本。 –