파이썬 컨텍스트 라이브러리

Fariba Laiq 2023년1월30일
  1. Python에서 with 문을 컨텍스트 관리자로 사용
  2. Python에서 함수 데코레이터 @contextmanager 사용
파이썬 컨텍스트 라이브러리

때로는 파일과 같은 일부 리소스를 사용합니다. 우리는 그것을 열고 작업을 마치면 닫는 것을 잊습니다.

이는 잘못된 코딩 방식이며 너무 많은 파일이 열려 있으면 문제가 발생합니다. 이러한 리소스가 더 이상 필요하지 않더라도 프로그램에서 무기한으로 리소스를 확보할 수 있습니다.

이 상황은 메모리 누수가 발생합니다. 이러한 것들을 자동으로 처리하기 위해 Python에는 컨텍스트 관리자가 있습니다.

그들은 자원 관리를 담당합니다. contextlibwith 키워드를 사용하여 리소스 관리를 위한 유틸리티를 제공하는 Python 라이브러리입니다.

Python에서 with 문을 컨텍스트 관리자로 사용

Python에서 with 문은 리소스를 관리하고 예외를 처리합니다. 따라서 컨텍스트 관리자로 작동합니다.

코드가 with 문에 도달하면 일시적으로 리소스를 할당합니다. with 문 블록이 실행을 완료하면 이전에 획득한 리소스가 해제됩니다.

다음 코드에서는 파일을 만들고 열었습니다. with 블록에서 획득한 리소스는 컨트롤이 with 블록을 벗어날 때 해제됩니다.

예제 코드:

with open("file.txt", "w+") as f:
    print("File Opened")

출력:

File Opened

프로그램에 컨텍스트 관리자 기능도 포함할 수 있습니다. 이를 위해 우리 클래스에는 __enter__()__exit__() 메서드가 있어야 합니다.

컨텍스트 관리자의 흐름을 이해하기 위해 제어가 해당 블록으로 이전될 때 실행되는 print 문으로 다음 코드를 실행했습니다.

예제 코드:

class MyContextManager:
    def __init__(self):
        print("In init method")

    def __enter__(self):
        print("In enter method")

    def __exit__(self, exc_type, exc_value, exc_traceback):
        print("In exit method")


with MyContextManager() as m:
    print("With block")

출력:

In init method
In enter method
With block
In exit method

Python에서 함수 데코레이터 @contextmanager 사용

함수를 컨텍스트 관리자로 만드는 또 다른 방법은 함수 데코레이터 @contextmanager를 사용하는 것입니다. 데코레이터는 다른 함수를 입력으로 받아 기능을 확장/동작을 수정하고 다른 함수를 출력으로 반환하는 함수입니다.

이 데코레이터를 사용할 때 별도의 클래스나 __enter__()__exit__() 함수를 작성할 필요가 없습니다. contextlib 모듈에서 컨텍스트 관리자를 가져와야 합니다.

함수 위에 @contextmanager를 사용합니다. yield 키워드는 값/컨트롤을 반환하는 데 사용되는 return 문과 같습니다.

yield 키워드 앞의 모든 항목은 __enter__ 섹션으로 간주되고 yield 이후의 모든 항목은 __exit__ 섹션으로 간주됩니다.

예제 코드:

from contextlib import contextmanager


@contextmanager
def MyContextManager():
    print("In enter method")
    yield
    print("In exit method")


with MyContextManager() as m:
    print("With block")

출력:

In enter method
With block
In exit method
작가: Fariba Laiq
Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn