Python Context Manager
Python 의 컨텍스트 관리자는 널리 사용되지만, 그 사용 목적을 이해하는 사람은 많지 않습니다. 파일 읽기 및 쓰기와 함께 흔히 사용되는 이 구문들은 특정 프로세스 동안 특정 리소스만 사용되도록 보장함으로써 애플리케이션이 시스템 메모리를 보존하고 리소스 관리를 개선하도록 돕습니다.
with 문
컨텍스트 관리자는 컨텍스트 (코드 블록) 가 시작되고 끝날 때 알림을 받는 객체입니다. 일반적으로 with 문과 함께 사용됩니다. 이 문이 알림 처리를 담당합니다.
예를 들어, 파일 객체는 컨텍스트 관리자입니다. 컨텍스트가 끝나면 파일 객체가 자동으로 닫힙니다.
# 컨텍스트 관리자: 리소스 정리를 자동으로 처리
# 'with' 블록을 나갈 때 파일이 자동으로 닫힘
with open(filename) as f: # 'f'는 파일 객체
file_contents = f.read()
# 오류가 발생하더라도 여기서 파일은 자동으로 닫힘
퀴즈
로그인하여 이 퀴즈에 답하고 학습 진행 상황을 추적하세요
컨텍스트 관리자 (
with 문) 를 사용하는 주된 이점은 무엇입니까?A. 오류가 발생하더라도 리소스 정리를 자동으로 처리합니다
B. 코드 실행 속도를 높입니다
C. 여러 파일을 동시에 열 수 있게 합니다
D. 모든 오류를 방지합니다
블록 실행이 종료되는 모든 것은 컨텍스트 관리자의 exit 메서드를 호출하게 만듭니다. 여기에는 예외도 포함되며, 오류로 인해 열린 파일이나 연결을 조기에 종료해야 할 때 유용할 수 있습니다. 파일을 닫거나 연결을 끊지 않고 스크립트를 종료하는 것은 데이터 손실이나 기타 문제를 야기할 수 있는 나쁜 방법입니다. 컨텍스트 관리자를 사용하면 이러한 방식으로 손상이나 손실을 방지하기 위한 예방 조치가 항상 취해지도록 보장할 수 있습니다.
직접 컨텍스트 관리자 작성하기
contextlib.contextmanager 데코레이터 덕분에 제너레이터 구문을 사용하여 컨텍스트 관리자를 작성하는 것도 가능합니다.
# contextlib 데코레이터를 사용한 함수 기반 컨텍스트 관리자
import contextlib
@contextlib.contextmanager
def context_manager(num):
print('Enter') # yield 이전 코드는 __enter__에서 실행됨
yield num + 1 # yield 된 값이 'cm' 변수가 됨
print('Exit') # yield 이후 코드는 __exit__에서 실행됨
with context_manager(2) as cm: # cm 은 yield 된 값 (3) 을 받음
print('Right in the middle with cm = {}'.format(cm))
Enter
Right in the middle with cm = 3
Exit
클래스 기반 컨텍스트 관리자
클래스 기반 컨텍스트 관리자를 정의할 수 있습니다. 핵심 메서드는 __enter__와 __exit__입니다.
# 클래스 기반 컨텍스트 관리자: __enter__ 및 __exit__ 메서드 구현
class ContextManager:
def __enter__(self, *args, **kwargs): # 'with' 블록 진입 시 호출됨
print("--enter--")
return self # 'as' 변수로 사용할 객체를 반환할 수 있음
def __exit__(self, *args): # 'with' 블록 종료 시 호출됨
print("--exit--")
with ContextManager(): # __enter__ 호출 후, 완료되면 __exit__ 호출
print("test")
--enter--
test
--exit--
퀴즈
로그인하여 이 퀴즈에 답하고 학습 진행 상황을 추적하세요
클래스를 컨텍스트 관리자로 사용하려면 어떤 메서드를 구현해야 합니까?
A.
**init** 및 **del**B.
**enter** 및 **exit**C.
open 및 closeD.
start 및 stop