2016-09-28 2 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

리팩터링하는 방법은 괄호로 묶은 코드가 할 수있는 것에 따라 달라집니다. ('return','continue','break' 또는'yield'를 사용합니까?) – 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 문을 건너 뛰고 파일의 다음 줄로 넘어갈 수 없습니다.