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 

dict 中的所有变量都是在初始化函数中手动输入的。如果需要,可以更改标签。

对于上下文,引用代码:

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

2 回答 2

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属性。这将使该类还包含常见任务的方法。例如:regextitle_regexLevel

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()
于 2012-11-06T19:53:52.967 回答
0

您是否有理由不能将其放入列表中,并使用列表索引作为您的级别编号?前任:

levels = [{'URLRegEx' : 'l1url', 'titleRegEx' : 'l1title', 'buildPortion' : 'l1build'},
          {'URLRegEx' : 'l2url', 'titleRegEx' : 'l2title', 'buildPortion' : 'l2build'},
          ...]
于 2012-11-06T19:56:16.070 回答