contextlib.contextmanager — 더 쉬운 길
__enter__/__exit__ 가진 클래스 짜는 게 단순 케이스엔 장황. contextlib.contextmanager 가 generator 를 context manager 로. yield 전 코드가 setup. yield 된 값이 as 로 바인딩. yield 후 코드가 teardown. 본문 예외가 yield 통해 전파 — try/finally 로 감싸 정리 보장.
모양 — yield 하나 + 안전을 위한 try/finally
정석 모양 — setup, 그 다음 try: yield value; finally: teardown. try 가 본문 raise 해도 teardown 실행 보장. 없으면 본문 예외가 teardown skip — context manager 가 막으려고 만들어진 부류 버그.
contextlib.suppress — 삼키는 패턴 깔끔히
with contextlib.suppress(FileNotFoundError): 가 그 예외 타입 삼키고 블록 빠져나옴. "이 특정 에러 무시" 패턴엔 try/except/pass 보다 깔끔, 특히 비자명한 정리 path 에서.
contextlib.ExitStack — 동적으로 많은 컨텍스트 합성
가끔 컴파일 타임에 컨텍스트 몇 개 진입할지 모를 때 — 열 파일 list, 락 가변 개수. ExitStack 이 다른 컨텍스트를 가면서 스택에 push 가능한 context manager, 빠질 때 다 풀어. 깊게 중첩하는 우회 대체.
Pythonic Way: setup/teardown 이 generator 에 들어갈 만큼 단순하면 클래스 기반보다
@contextmanager. __enter__ 호출 간 살아남는 state 필요하거나 더 풍부한 인터페이스 (재진입, 설정) 원하면 클래스 형태.