파이썬 컨텍스트 라이브러리
때로는 파일과 같은 일부 리소스를 사용합니다. 우리는 그것을 열고 작업을 마치면 닫는 것을 잊습니다.
이는 잘못된 코딩 방식이며 너무 많은 파일이 열려 있으면 문제가 발생합니다. 이러한 리소스가 더 이상 필요하지 않더라도 프로그램에서 무기한으로 리소스를 확보할 수 있습니다.
이 상황은 메모리 누수가 발생합니다. 이러한 것들을 자동으로 처리하기 위해 Python에는 컨텍스트 관리자가 있습니다.
그들은 자원 관리를 담당합니다. contextlib
는 with
키워드를 사용하여 리소스 관리를 위한 유틸리티를 제공하는 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
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