我试图整理一个具有'级别概念的工具。 每个级别'有一组变量是支持我想要实现的特定于每个级别的活动所需的。
我编写了一个可以工作的硬编码版本(在某种程度上),但它仅限于我硬编码的级别数。令我感到震惊的是,必须有一种更加流畅的方式来编写这个函数,这样才能生成水平变量:
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()
答案 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
的类,其中包含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()
答案 1 :(得分:0)
有没有理由你不能把它放在一个列表中,并使用列表indeces作为你的级别数?例如:
levels = [{'URLRegEx' : 'l1url', 'titleRegEx' : 'l1title', 'buildPortion' : 'l1build'},
{'URLRegEx' : 'l2url', 'titleRegEx' : 'l2title', 'buildPortion' : 'l2build'},
...]