With문과 Context manager
With문과 Context manager
파일이나 소켓과 같은 특정한 리소스에 액세스하는 경우에 일반적으로 해당 리소스를 열면서
제어를 위한 핸들을 얻고, 리소스의 회수를 위해서 모든 작업이 완료된 경우에는 반드시 해당 핸들을 닫는 식의 흐름이 필요합니다.
기존에 file processing을 하는 경우 open -> context -> close 형태로 사용하고,
이중에 file open 이 fail 되었을 경우 등등 예외처리를 하게 되었는데,
이런형태로 구현을 하다보면 아무래도 구현의 초점이 잘 안맞춰지기 마련입니다.
보통의 예외처리에선 try/except/finally 구문을 통해서 흐름의 끝에서 리소스를 정리하고 루틴을 떠나는 형태로 코드를 작성하는 방법도 있지만,
이러한 방법 역시 예외가 발생하는 케이스와 탈출 조건을
만족하는 케이스에 대해서 각각 리소스를 정리하는 코드가 중복으로 들어가야 하는 경우가 있습니다.
이러한 경우들을 해결하고자 Context manager 가 나왔고 리소스의 액세스를 with 라는 구문을 통해서 특정 블럭 내의 동작으로 제한하고,
블럭을 나가는 경우에 그 사유가 어떻게 되든간에 리소스의 해제 처리를 자동으로 하는 것을 보장해주게 됩니다.
Context manager
컨텍스트 매니저는 다음 두 개의 메소드를 정의하고 있는 것으로 간주합니다.
__enter__(self)
: with 문에 진입하는 시점에 자동으로 호출
__exit__(self, type, value, traceback)
: with 문이 끝나기 직전에 자동으로 호출
먼저 컨텍스트 매니징 함수 자체는 제너레이터 함수여야 합니다.(with 문과 함께 호출되었을 때 컨텍스트 내에 있을 어떤 객체를 리턴해야 하므로)
이 제너레이터 함수는 with 구문 내에서 사용될 객체를 말합니다.
제너레이터는 yield 문까지 실행된 후에 with 구문 블럭을 실행하게됩니다.
블럭의 실행이 종료되면 제너레이터가 끝까지 실행됩니다.
With 구문 사용
이 with 구문의 사용은 주로 file ,socket, db access, login process 등등에서 활용이 가능하고, 이 with 구문의 활용은 무궁무진합니다
Reference
http://pyengine.blogspot.com/2019/12/with-context-manager.html
https://soooprmx.com/archives/4079