2009-12-08 4 views
0
def checkCache(cachedText): 
    for line in open("cache"): 
     if cachedText + ":" in line: 
      print line 
      open("cache").close() 
     else: 
      requestDefinition(cachedText) 

이 코드는 파일 (캐시)의 각 행에서 특정 문자열 (cachedText + ":")을 검색합니다.파일에서 문자열을 검색하고 문자열이 없으면 함수를 실행합니다. in python

다른 기능 (requestNewDefinition (cachedText))를 호출하는 의미있는 전체 파일특정 문자열을 찾을 수없는 경우.

그러나 위의 코드는 각 일치하지 않는 행에 대해 함수를 실행합니다.

문자열 (cachedText + ":")로 파일을 검색하는 방법과에서 문자열이 발견되지 않으면 다른 곳에서 함수를 실행 하시겠습니까?

예 캐시 :이 같은

hello:world 
foo:bar 

답변

2

for 루프가 손상되었습니다. 실제로 파일의 각 행을 점검하고 일치하지 않는 각 행에 대해 함수를 실행 중입니다.

참고 : open("cache").close()을 호출하면 for 루프의 시작 부분에 열린 핸들을 닫지 않고 즉시 캐시 파일을 열고 닫을 수 있습니다.

원하는 것을 수행하는 한 가지 방법은 루프의 else 절을 만드는 것입니다. for 루프에서 else가 까다로워지는 것에주의하십시오!.

def checkCache(cachedText): 
    cache = open("cache") 
    for line in cache: 
     if cachedText + ":" in line: 
      break 
    else: 
     requestDefinition(cachedText) 
    cache.close() 

for 루프의 다른 부분은 더 break가 루프에서 호출되지 않은 경우에만, 루프의 끝에서 실행한다.

+0

열려있는 파일을 변수에 할당해야합니까? 그것은 더 빠릅니다 - 아니면 더 나은 방법일까요? – torger

+0

for 루프의 else가 까다로운 이유는 무엇입니까? – torger

+0

@nazarius : 열려있는 파일을 닫으려고 추적 할 수 있습니다. 이 함수를 계속 호출하면 시스템 리소스를 고갈시키지 않으려면 파일을 닫아야합니다. –

1

뭔가 다음 else:for 아닌 if에 부착하는 방법을

def checkCache(cachedText): 
    for line in open("cache"): 
     if cachedText + ":" in line: 
      print line 
      break 
    else: 
     requestDefinition(cachedText) 

알 수 있습니다. else:은 이 break을 실행하지 않고 반복 가능을 소모하여 완료되는 경우에만 실행되며 이는 cachedText이 파일의 어느 곳에서도 발견되지 않음을 의미합니다. 자세한 내용은 the Python documentation을 참조하십시오.

1

제 생각에 당신은 이와 비슷한 것을 원합니다. 그 줄이 발견되면 "깨뜨려 야합니다". "break"는 for 루프를 종료합니다. if 문과 반대되는 for 루프에 첨부 된 else 문은 for 루프가 "break"조건을 수행하지 않고 각 행을 반복 할 경우에만 실행됩니다. 작업을 마친 후에도 파일을 닫고 싶습니다.

def checkCache(cachedText): 
    f = open("cache") 
    for line in f: 
     if cachedText + ":" in line: 
      print line 
      break 
    else: 
     requestDefinition(cachedText) 
    f.close() 
관련 문제