制作动态变量集

时间:2012-11-06 19:51:39

标签: python

我试图整理一个具有'级别概念的工具。 每个级别'有一组变量是支持我想要实现的特定于每个级别的活动所需的。

我编写了一个可以工作的硬编码版本(在某种程度上),但它仅限于我硬编码的级别数。令我感到震惊的是,必须有一种更加流畅的方式来编写这个函数,这样才能生成水平变量:

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

2 个答案:

答案 0 :(得分: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_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()

答案 1 :(得分:0)

有没有理由你不能把它放在一个列表中,并使用列表indeces作为你的级别数?例如:

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