Python 컨텍스트 관리자: 블록을 사용하여 사용자 정의 만들기

Python에서 사용자 정의 컨텍스트 관리자를 작성하는 방법을 알아보세요. 리소스 안전을 위해 contextmanager 데코레이터와 __enter__/__exit__ 메서드를 마스터하세요.

에디터에서 사용해 보세요

개요

컨텍스트 관리자는 외부 리소스의 설정 및 해제를 처리하도록 설계된 Python의 우아한 메커니즘입니다. 소프트웨어에서 많은 작업에는 파일 열기 및 닫기, 데이터베이스 연결 및 연결 끊기, 잠금 획득 및 해제 등 한 쌍의 작업이 필요합니다. 설정 단계 이후, 해체 단계 이전에 프로그램이 충돌하는 경우 해당 리소스는 메모리에 잠겨 있는 상태로 유지됩니다. 컨텍스트 관리자는 모든 상황에서 리소스가 안전하게 정리되도록 보장합니다.

컨텍스트 관리자를 호출하는 표준 방법은 `with` 문을 사용하는 것입니다. 내부적으로 'with' 문에 사용되는 모든 개체는 컨텍스트 관리자 프로토콜을 구현해야 합니다. 이 프로토콜은 `__enter__()`와 `__exit__()`라는 두 가지 특수 메서드로 구성됩니다. `with` 블록이 시작되면 `__enter__()`가 호출되어 리소스를 준비합니다. `with` 블록이 완료되거나 예외가 발생하면 `__exit__()`가 자동으로 트리거되어 발생한 예외에 대한 정보를 수신하여 정리를 처리하거나 오류를 억제할 수 있습니다.

간단한 사용 사례의 경우 `__enter__` 및 `__exit__` 메서드를 사용하여 클래스를 작성하면 장황하게 느껴질 수 있습니다. 이를 단순화하기 위해 Python의 표준 라이브러리는 `@contextmanager` 데코레이터를 갖춘 `contextlib` 모듈을 제공합니다. 이 데코레이터를 사용하면 단일 `yield` 문을 포함하는 간단한 생성기 함수를 작성할 수 있습니다. 'yield' 앞의 코드는 설정 역할을 하고, 산출된 값은 리소스 역할을 하며, 'yield' 뒤의 코드는 정리를 나타냅니다. 컨텍스트 관리자를 마스터하면 애플리케이션이 누출되지 않는 상태로 유지됩니다.

코드 및 실행 출력

실행 로깅 경계를 관리하기 위해 __enter__ 및 __exit__를 구현하는 사용자 정의 클래스입니다.

class CustomManager:
    def __enter__(self):
        print("--> Resource Setup: Entering the block")
        return "RESOURCE_KEY"

    def __exit__(self, exc_type, exc_value, traceback):
        print("<-- Resource Teardown: Exiting the block")
        if exc_type:
            print(f"Exception Intercepted: {exc_value}")
        return True  # Suppress exceptions

with CustomManager() as res:
    print(f"Working inside block with resource: {res}")
    # Force an error to verify exception handling
    x = 1 / 0
print("Program continues running safely.")
터미널 출력
--> Resource Setup: Entering the block
Working inside block with resource: RESOURCE_KEY
<-- Resource Teardown: Exiting the block
Exception Intercepted: division by zero
Program continues running safely.

단계별 구현

  • 데이터베이스 트랜잭션 관리(성공 시 커밋, 오류 시 롤백)
  • 멀티스레드 코드에서 스레드 잠금 획득 및 해제
  • 단위 테스트 스크립트 중 표준 출력(stdout) 리디렉션

자주 묻는 질문

사용자 정의 컨텍스트 관리자에서 예외를 억제하려면 어떻게 해야 합니까?

__exit__ 메소드에서 True를 반환합니다. True를 반환하면 블록 내부에서 발생한 모든 예외가 억제됩니다.

하나의 명령문에 여러 컨텍스트 관리자를 결합할 수 있습니까?

예, 쉼표로 구분할 수 있습니다(예: open('file1.txt')를 f1로, open('file2.txt')를 f2:로 사용).

관련 주제

권장 Python 리소스

관련 대화형 튜토리얼, 치트 시트, 코드 비교를 통해 지식을 확장하세요.