파이썬 with 정리

파이썬 with 에 대해서 알아본다. 사소한 것이지만 이런 부분들이 몸에 잘 베일 수록 코딩은 용이해진다. 잘 알아두고 자주 활용하길 바란다.



 

파이썬 with

보통 프로그램은 파일에 접근해서 파일 내용등을 읽고 쓰고 삭제하고 수정하는 등등 무언가의 일을 수행한 뒤 그 파일을 해제(close) 하는 패턴을 따른다. 예를 들어 우리가 엑셀 파일을 열었는데 그 엑셀파일을 열고 있는 동안에는 다른 프로그램에서 엑셀 파일에 접근할 수 없게 된다. 거두절미하고 파일을 열었으면 닫아주는 일을 빼먹지 말아야 한다는 것이다. 보통은 close() 등과 같은 메소드를 사용하지만 여기에는 숨은 문제점이 있다. 파일 처리를 수행하는 도중에 오류가 발생하게 되면 close() 문을 실행할 수 없고 그렇게 되면 이 파일은 영원히 닫을 수가 없게 된다. with 문은 그 구문을 실행했을 때 오류가 발생하든 안하든 마지막에 close 를 해주도록 하는 것이다.

동작방식

파이썬은 특수메소드를 사용한다. 클래스를 알고 있다면 이해하기 쉬울 것이고 모르면 이 부분은 넘어가도 상관없다. __enter__ 와 __exit__ 특수메소드를 가진 객체에 with 문을 쓸 수 있는 것이다. with 문 내 표현식은 한 객체로 평가된다. 이어서 이 객체의 __enter__ 메서드가 호출되고 끝으로 호출 결과가 변수에 할당되는 것이다. 블록을 모두 실행하면 블록에서 오류가 발생했더라도 파이썬은 그 객체에 __exit__메서드를 호출하게 된다. 파일 객체의 __exit__ 메소드는 파일을 닫는다.

사용 예제

with 문의 형식은 다음과 같다.

with <expression> as <variable>:

<block>

 

위와 같이 보면 감이 안오니 실제 예제를 보도록 하겠다.

with open('textfile.txt', 'r') as file:
    contents = file.read()

# 위 구문과 동일한 내용
file = open('textfile.txt', 'r')
contents = file.read()
file.close()

위 구문을 보면 쉽게 이해가 갈 것이다. 두번째 코드를 실행한다고 할때 만약에 content = file.read() 에서 에러가 난다면 file 을 닫을 수 없다. 그러나 with 문을 사용하면 에러가 나더라도 file 을 자동으로 닫아준다.

간단하지 않은가?