2013-05-13 4 views
4

의 문은 내가 좋아하는 기능이 있나요? "with"문을 무시할 수 있습니까? 즉, 메모리 누수의 관점에서 보면 안전하고 동등한 것입니까?파일 열기 및 파이썬

def func(filename): 
    return [line.split('\t')[0] for line in open(filename)] 

?

답변

4

안전합니다. 컨텍스트 관리자의 __exit__은 컨텍스트 내부에서 return 인 경우에도 호출되므로 파일 핸들이 제대로 닫힙니다. 당신이 test()를 호출 할 때

class ContextTest(object): 
    def __enter__(self): 
     print('Enter') 

    def __exit__(self, type, value, traceback): 
     print('Exit') 

def test(): 
    with ContextTest() as foo: 
     print('Inside') 
     return 

, 당신이 얻을 :

다음은 간단한 테스트입니다

Enter 
Inside 
Exit 
+0

미안 그것은 나에게 매우 명확하지 않다 나는 두 번째 대안 '과'하고 사용을 무시할 수 있습니까? – elyase

+0

@elyase : 두 예제 모두 메모리 누수가 없지만 두 번째 파일 핸들을 명시 적으로 닫지 않아 문제가 발생할 수 있습니다. http://stackoverflow.com/questions/4599980/python-close-file -descriptor-question – Blender

+0

좋은 예! '... as test '를 다른 것으로 변경하고 싶을 수도 있습니다. 함수 이름도 테스트이기 때문에 잠시 멈췄습니다. – monkut

0

이 안전 실제로 with...as... 구문의 전체 목적은 보장; 그렇지 않으면 매우 어색 할 블록 try/finally을 대체합니다. 그래서 예, 안전하다는 보장이 있습니다. 그래서 나는 멀리 with open as f에서 f = open까지 선호합니다.

구문이 존재하는 이유와 작동 원리에 대한 설명은 http://effbot.org/zone/python-with-statement.htm을 참조하십시오. __enter____exit__ 메서드로 클래스를 작성하면이 구문을 실제로 활용할 수 있습니다.

또한이 기능에 대한 PEP를 참조하십시오 http://www.python.org/dev/peps/pep-0343/