2012-11-06 74 views
0

我正在嘗試組合一個具有「級別」概念的工具。 每個'級別'都有一組變量,這些變量需要用來支持我想要達到的特定於每個級別的活動。製作一個動態變量集

我已經寫了一個硬編碼的版本,可以在某種程度上起作用,但是它僅限於硬編碼的層數。這讓我感到必須有寫本功能等都可以動態生成的水平瓦爾的巧妙方式:

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() 

回答

7

你可能只是做:

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

另外,你每次訪問同一級別的關卡數據時都不會構建全新的字典。 –

0

是否有一個原因,你不能只是把這個列表中,並使用該列表的indeces當你的水平的數字?例如:

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

我可以做,但這仍然會導致一個硬編碼集,而不是一個動態的? –

+0

沒有更多的硬編碼,那麼你的'baseDict'。 –

+0

的確,但重點是要從硬編碼版本中獲得出路,並創建一個可擴展到n級的動態版本。 –