2013-02-08 2 views
12

python의 with ... as 문에 의존하는 것이 안전하거나 좋은 연습으로 간주된다면 궁금합니다. 그래서 파이썬은 객체에게 __exit__() 메소드를 호출하여 with...as 문을 종료 할 때 나는 그것을가 호출을 가정 할 수 있지만 명시 적으로 myFile.close() 전화를 소홀히이 예에서python의 with ... with 문에 의존하는 것이 좋습니다.

with open("myfile","w") as myFile: 
    #do something 

: 예를 들어, 파일을 열 때. 안전하게 좋은 방법은 /이에 의존하거나 항상 명시 적으로 당신을 위해 파일을 닫습니다 에 의존, file.close()

+0

예제 코드가 쓰기 위해 열린 파일에서 읽으려고 했습니까? – geoffspear

+0

죄송합니다. 지금 간단한 예제를 작성하여 수정했습니다. – Blaine

답변

17

이 컨텍스트 관리자는에 대한 있는 것입니다 전화 좋을 것입니다. 컨텍스트 관리자는 예외가 있더라도 호출됩니다.

대안은 대신 finally 블록을 사용하는 것입니다

myFile = open("myfile","w") 
try: 
    # do something with myFile 
finally: 
    myFile.close() 

하지만

try:의 내부 블록이 긴 수 있기 때문에, 당신은 finally 문에 도착하는 시간에 의해 당신이 설정했는지 잊어 버린 .

컨텍스트 관리자는 여전히 강력합니다. __exit__ 메서드에 예외가 알려 지므로 예외 처리기로도 작동 할 수 있습니다 (예외는 무시하고 다른 예외를 발생시킵니다.).

4

예, with 문장이 더 좋습니다. Python 2.5부터 파일 객체에는 __enter__()__exit__() 메소드가 있습니다. __exit__() 메서드는 파일 개체를 닫습니다.

파이썬은 __exit__() 메서드를 호출 할 것을 보증하지만 __exit__() 메서드가 특히 타사 코드를 사용하여 메서드를 종료한다는 보장은 없습니다. 수동으로 확인해야합니다.