0

「レベル」という概念を持つツールをまとめようとしています。各「レベル」には、達成したいアクティビティをサポートするために必要な、各レベルに固有の一連の変数があります。

(ある程度) 動作するハードコード バージョンを作成しましたが、ハードコードしたレベルの数に制限されます。その場でレベル変数を生成できるように、この func を書くためのより洗練された方法が必要であると私は思います:

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 

辞書内のすべての変数は、初期化関数に手動で入力されます。必要に応じてラベルを変更できます。

コンテキストについては、参照コード:

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属性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()
于 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 に答える