with 구문은 파이선 2.5에서 도입된 기능으로 어떤 블럭에 진입하고 나올 때 지정된 객체(context manager)로 하여금 그 시작과 끝에서 어떤 처리를 하도록 할 때 사용한다.
with A:
pass
위 코드에서 A는 with 블럭이 시작되는 시점에 A.enter()를 호출하고, 블럭이 끝나는 시점에 A.exit()를 호출한다. 만약 블럭 내에서 예외가 발생하여 블럭의 실행이 중지되고 빠져나오는 시점에도 A.exit()가 호출되는 것이 보장된다.
예를 들어 파일을 열어서 어떤 내용을 처리하고 파일을 닫는 동작을 수행할 때, 컨텍스트 매니저가 파일을 열고, 닫는 동작을 정의한다면, with 구문에서는 이를 컨텍스트 매니저(이 경우에는 파일 디스크립터)에게 이러한 동작을 위임하고 실제 데이터를 처리하는 코드만 작성할 수 있다.
with open('filename','w') as f:
f.write(someString);
이상과 같이 파일 디스크립터에 대해 별도의 close()가 없더라도 코드 블럭을 빠져나올 때 컨텍스트 매니저에 의해 자동으로 close()가 수행된다.
파일 처리에 관해서
파일을 처리하고자 할 경우에 항상 하는 일의 순서는 다음의 과정을 따르게 된다.
1. 파일을 열고
2. 열은 파일을 처리하고
3. 열어 놓은 파일을 닫는다.
1. data_file = open(‘test.dat’)
2. print(data_file.readline(), end=”)
3. data_file.close()
그런데 파일을 열었으면 닫아줘야 하는 작업은 항상 해야한다. 화장실 갔다 오면서 지퍼를 안올리면 안되지 않겠는가? ^^ 매번 닫아줘야 하는 반복 작업의 경우 파이썬 인터프리터가 자동으로 닫아주면 좋을 것이다. 빼먹을 염려도 없고 말이다. 이렇게 with as를 쓰면 인터프리터가 자동으로 구문이 끝나면 마무리(?)를 해준다. 사용방법은 다음과 같다.
