[python] context manager

About_work·2023년 11월 16일
0

python 기초

목록 보기
27/65

GPT의 대답

  • Python에서의 컨텍스트 매니저(Context Manager)는 특정 블록의 실행 전후에 자동으로 작업을 수행하는 객체
  • 이 개념의 핵심은 리소스 관리와 예외 처리를 간결하고 효과적으로 할 수 있게 하는 것

기본 개념

컨텍스트 매니저는 다음 두 가지 메서드를 구현하는 객체입니다:

  1. __enter__: 컨텍스트 블록이 시작될 때 자동으로 호출됩니다. 여기서 필요한 리소스를 할당하거나 초기화할 수 있습니다.
  2. __exit__: 컨텍스트 블록이 종료될 때 자동으로 호출됩니다. 여기서 리소스를 정리하거나 해제하는 작업을 수행합니다. 또한, 이 메서드는 예외 처리에도 사용될 수 있습니다.

사용법

  • Python의 with 문을 사용하여 컨텍스트 매니저를 활용할 수 있습니다.
  • with 문은 컨텍스트 블록의 시작과 끝에서 자동으로 __enter____exit__ 메서드를 호출합니다.

예시

파일 핸들링에서 컨텍스트 매니저의 사용 예:

with open('example.txt', 'r') as file:
    data = file.read()
# 파일이 자동으로 닫힘

여기서 open 함수는 컨텍스트 매니저를 반환합니다. with 문은 파일을 열고 (__enter__), 파일을 읽은 후에는 자동으로 파일을 닫습니다 (__exit__).

장점

  • 자원 관리: 파일, 네트워크 연결, 락 등의 자원을 안전하게 관리할 수 있습니다.
  • 예외 처리: __exit__ 메서드는 예외가 발생했을 때 실행되므로, 예외 발생 시 자원을 정리하는 데 유용합니다.
  • 코드 간결성: 리소스의 할당과 해제를 자동으로 처리하기 때문에 코드가 더 간결하고 읽기 쉬워집니다.

재사용 가능한 try/except 동작을 원한다면, contextlib와 with문을 사용하라.


ExitStack

from contextlib import ExitStack

  • 여러 컨텍스트 관리자(Context Managers)를 쉽고 깔끔하게 관리할 수 있게 해주는 유틸리티
  • ExitStack를 사용하여 여러 리소스의 생성 및 소멸을 단일 블록 내에서 관리할 수 있으며, 예외 발생 시에도 모든 리소스가 올바르게 정리

ExitStack의 주요 기능

  • 리소스 관리:
    • ExitStack은 다양한 리소스(파일, 네트워크 연결, 잠금 등)의 생성 및 소멸을 관리하는 데 유용
    • 이 클래스는 여러 리소스의 생명주기를 효과적으로 관리할 수 있게 해줌
  • 동적 컨텍스트 관리:
    • ExitStack은 실행 시간에 동적으로 컨텍스트 관리자를 추가하고 제거할 수 있게 해줍니다.
    • 이를 통해 프로그램의 흐름에 따라 리소스를 유연하게 관리할 수 있습니다.
  • 예외 안전성:
    • ExitStack은 예외 발생 시에도 열린 모든 리소스가 올바르게 종료되도록 보장합니다.
    • 이는 리소스 누수를 방지하고 안정적인 코드 작성을 돕습니다.
  • with 문과의 호환성:
    • ExitStack은 Python의 with 문과 함께 사용될 수 있으며,
    • 이를 통해 리소스 관리 코드를 간결하고 명확하게 작성할 수 있습니다.

ExitStack().enter_context 메서드는 ExitStack의 사용 중 하나로, 이 메서드를 통해 다양한 컨텍스트 매니저를 ExitStack 인스턴스에 추가할 수 있습니다.

enter_context 메서드

  • enter_context 메서드는 ExitStack에 새로운 컨텍스트 매니저를 추가하는 방법
  • 인자로는 handle을 넣어야 함. (https://velog.io/@jk01019/handlePointer)
  • 이 메서드는 컨텍스트 매니저를 인자로 받아, 해당 컨텍스트 매니저의 __enter__ 메서드를 호출
  • 그리고 나서, ExitStack은 이 컨텍스트 매니저의 __exit__ 메서드를 자동으로 호출하도록 스택에 추가

사용 예시

  • 다음은 ExitStackenter_context 메서드를 사용하는 예시입니다:
from contextlib import ExitStack

with ExitStack() as stack:
    file1 = stack.enter_context(open('file1.txt', 'r'))
    file2 = stack.enter_context(open('file2.txt', 'r'))
    # 여기에서 file1과 file2를 사용
    # ...

# ExitStack 블록을 벗어나면 file1과 file2는 자동으로 닫힘
  • 이 예시에서, 두 개의 파일을 열고 ExitStack에 추가합니다. with 블록을 벗어날 때, ExitStack은 자동으로 두 파일을 닫습니다.
  • 이 방법을 사용하면 여러 리소스를 효율적으로 관리하고, 예외 발생 시에도 안전하게 리소스를 정리할 수 있습니다.

장점

  • 동적 관리: 프로그램의 실행 흐름에 따라 동적으로 리소스를 관리할 수 있습니다.

  • 예외 안전성: 예외가 발생해도 모든 컨텍스트 매니저의 __exit__ 메서드가 호출되어 리소스가 안전하게 정리됩니다.

  • 코드 간결성: 여러 컨텍스트 매니저를 하나의 with 블록 안에서 관리할 수 있어 코드가 간결해집니다.

  • ExitStack은 복잡한 리소스 관리나 예외 처리가 필요한 상황에서 매우 유용한 도구로 활용됩니다.

profile
새로운 것이 들어오면 이미 있는 것과 충돌을 시도하라.

0개의 댓글