Python에서 컨텍스트 관리자를 사용하는 방법(문 사용)

Python에서 컨텍스트 관리자가 작동하는 방식을 알아보세요. with 문을 익히고, 시스템 리소스를 관리하고, 사용자 정의 컨텍스트 관리자를 작성하세요.

Editor에서 이 솔루션을 사용해 보세요.

개요

파일 핸들 닫기, 데이터베이스 연결 끊기, 스레드 잠금 해제와 같은 외부 리소스를 적절하게 관리하는 것은 안정적이고 프로덕션에 바로 사용할 수 있는 소프트웨어를 구축하는 데 필수적입니다. 리소스를 해제하지 못하면 메모리 누수, 파일 잠금 오류 및 애플리케이션 중단이 발생할 수 있습니다.

Python의 `with` 문은 컨텍스트 관리자를 생성하여 리소스 정리를 단순화합니다. 컨텍스트 관리자는 코드가 예외를 발생시키거나 일찍 종료되더라도 제어가 블록을 떠날 때 정리 작업이 자동으로 실행되도록 보장합니다. 이렇게 하면 장황하고 반복적인 'try-finally' 블록이 필요하지 않습니다.

컨텍스트 관리자는 `open()`과 같은 내장 작업과 가장 일반적으로 연관되어 있지만 사용자 정의 컨텍스트 관리자를 쉽게 디자인할 수 있습니다. `__enter__` 및 `__exit__` 매직 메서드를 구현하는 클래스를 생성하거나 `contextlib.contextmanager` 데코레이터로 장식된 생성기 함수를 작성하여 이를 빌드할 수 있습니다.

코드 및 실행 출력

이 스크립트는 클래스 구현 및 contextlib 데코레이터를 사용하여 Python에서 사용자 정의 컨텍스트 관리자를 작성하는 방법을 보여줍니다.

from contextlib import contextmanager

# Method 1: Class-based context manager
class CustomResource:
    def __enter__(self):
        print("[Resource] Opening connection...")
        return self

    def do_work(self):
        print("[Resource] Performing action...")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("[Resource] Closing connection safely.")
        return False

print("--- Class Context Manager ---")
with CustomResource() as resource:
    resource.do_work()

# Method 2: Generator-based context manager (contextlib)
@contextmanager
def simple_timer():
    print("\n[Timer] Started...")
    try:
        yield
    finally:
        print("[Timer] Finished!")

print("\n--- Decorator Context Manager ---")
with simple_timer():
    print("Performing tasks inside context...")
터미널 출력
--- Class Context Manager ---
[Resource] Opening connection...
[Resource] Performing action...
[Resource] Closing connection safely.

--- Decorator Context Manager ---

[Timer] Started...
Performing tasks inside context...
[Timer] Finished!

단계별 구현

  • 리소스 안전을 보장하려면 파일, 데이터베이스 또는 잠금을 열 때 with 문을 사용하세요.
  • __enter__ 및 __exit__ 매직 메서드가 있는 클래스를 사용하여 사용자 정의 컨텍스트 관리자를 정의합니다.
  • 더 간단한 함수 기반 대안으로 생성기 함수에서 @contextlib.contextmanager 데코레이터를 사용하세요.
  • 오류가 발생하더라도 리소스 종료 작업이 실행되도록 하려면 정리 블록 내에 리소스 종료 작업을 배치하세요.

자주 묻는 질문

__exit__ 메소드는 어떤 매개변수를 수신합니까?

__exit__ 메소드는 예외가 발생한 경우 예외 세부 정보를 나타내는 세 가지 인수(exc_type(예외 유형), exc_val(예외 값) 및 exc_tb(추적))를 받습니다. 오류가 발생하지 않으면 세 가지 모두 없음으로 전달됩니다.

컨텍스트 관리자가 예외를 억제할 수 있습니까?

그렇습니다. __exit__ 메서드가 참값(예: True)을 반환하면 Python은 예외를 억제하고 with 블록 이후에 실행이 계속됩니다. False를 반환하면 예외가 정상적으로 발생합니다.

관련 주제

권장 Python 리소스

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