2016-09-28 17 views
1

次のコードは、いくつかのログファイルをスキャンし、特定の文字列を選択します。forループとネストされたifステートメントの組み合わせをリファクタリングするジェネレータ

with open(file) as input: 
    for line in input: 
     if 'REW' in line or 'LOSE' in line: 
      <some optional code> 
      if 'REW VAL' in line or 'LOSE INV' in line: 
       <some code> 

私はこれにいくつかの関数を書きましたが、すべての関数にはこの繰り返しコードが含まれているため、リファクタリングが必要です。そして私はジェネレータを作る必要があると思う。どのように私は角括弧内のコードを変更することができますこの発電機を作るのですか?任意のコードのために

+2

*リファクタリングが必要だと思います。そして私はジェネレータを作る必要があると思います*あなたは何をしていますか? –

+0

繰り返しコードを関数にするだけで、関数を呼び出すことはできますか? – coder

+0

これをどのようにリファクタリングするかは、括弧で囲まれたコードでできることに非常に依存します。 – chepner

答えて

1

繰り返しがそれほど悪くない場合もあります。

しかし、いずれにせよ、あなたがこのような何か試すことができます。

#!/usr/bin/env python 
# script.py 

def process_file(filename, func1, func2): 
    with open(filename) as f: 
     for line in f: 
      if '1' in line: 
       func1(line) 
       if '2' in line: 
        func2(line) 


def main(): 
    counters = {1: 0, 2: 0} 
    def func1(line): 
     # TODO Add some logic based on line value here 
     counters[1] += 1 
    def func2(line): 
     counters[2] += 1 
    process_file('table.csv', func1, func2) 
    return counters 


if __name__ == '__main__': 
    print(main()) 

をし、ファイルがある場合:

$ cat table.csv 
1 just one 
1 2 one and two 
1 
1 
0 
0 
2 
2 1 
1 0 2 
0 

し、スクリプトを実行します。

python script.py 

をあなたが取得します次の出力:

{1: 6, 2: 3} 

また、あなたがあなたのif文の述語を考慮することができます

def process_file(filename, func1, func2, predicate1, predicate2): 
    with open(filename) as f: 
     for line in f: 
      if predicate1(line): 
       func1(line) 
       if predicate2(line): 
        func2(line) 

def predicate1(line): 
    return 'REW' in line or 'LOSE' in line 

は素敵な関数名を選択することを忘れないでください!

1

は、あなたができる最善のは、私が取るの機能としてそれらを定義するあなたはf1f2はここ(と呼ばれている方法についていくつかの条件を課す必要がある

def foo(file, f1, f2): 
    with open(file) as input: 
     for line in input: 
      if 'REW' in line or 'LOSE' in line: 
       f1(line) 
       if 'REW VAL' in line or 'LOSE INV' in line: 
        f2(line) 

のような関数を記述しています行を入力として)。

これは完全に一般的ではありませんが、たとえば、関数f1は、次のifステートメントをスキップし、ファイルから次の行に進むことはできません。

関連する問題