반응형
질문
다음을 고려해보세요:
with open(path, mode) as f:
return [line for line in f if condition]
파일은 제대로 닫힐까요? 아니면 return
을 사용하는 것이 컨텍스트 매니저를 우회하는 방법이 있을까요?
답변
예, 이것은 try
블록 이후에 finally
블록처럼 작동합니다. 즉, 항상 실행됩니다 (물론 파이썬 프로세스가 비정상적인 방식으로 종료되지 않는 한).
with
문의 사양인 PEP-343의 예제 중 하나에도 언급되어 있습니다.
with locked(myLock):
# 이곳의 코드는 myLock이 보유 될 때 실행됩니다. 블록을 떠날 때 락이
# 해제되는 것이 보장됩니다 (반환 또는 처리되지 않은 예외로 인해 블록을 떠날 경우에도).
그러나 언급할 가치가 있는 것은 open()
호출로 발생하는 예외를 쉽게 잡을 수 없다는 것입니다. 일반적으로 원하지 않는 경우에는 전체 with
블록을 try..except
블록 안에 넣어야합니다.
반응형
댓글