Python 컨 텍스트 관리자 구현 방법

문제.
with 문 구 를 사용 할 수 있 도록 새로운 컨 텍스트 관리 자 를 만 들 고 싶 습 니 다.
해결 방안
새로운 컨 텍스트 관리 자 를 실현 하 는 가장 쉬 운 방법 은 contexlib 모듈 의@contextmanager 장식 기 를 사용 하 는 것 입 니 다.다음은 코드 블록 의 시간 계산 기능 을 실현 한 컨 텍스트 관리자 의 예 입 니 다.

import time
from contextlib import contextmanager

@contextmanager
def timethis(label):
  start = time.time()
  try:
    yield
  finally:
    end = time.time()
    print('{}: {}'.format(label, end - start))

# Example use
with timethis('counting'):
  n = 10000000
  while n > 0:
    n -= 1
함수timethis() 에서yield이전의 코드 는 상하 문 관리자 에서__enter__() 방법 으로 실행 되 고yield 이후 의 모든 코드 는 __exit__() 방법 으로 실 행 됩 니 다.이상 이 생기 면 이상 은 yield 구문 에 던 집 니 다.
다음은 좀 더 고 급 스 러 운 컨 텍스트 관리자 로 목록 대상 의 특정한 사 무 를 실현 합 니 다.

@contextmanager
def list_transaction(orig_list):
  working = list(orig_list)
  yield working
  orig_list[:] = working
이 코드 의 역할 은 목록 에 대한 수정 은 모든 코드 가 실행 되 고 이상 이 없 을 때 만 유효 합 니 다.다음은 우리 가 시범 을 보 여 드 리 겠 습 니 다.

>>> items = [1, 2, 3]
>>> with list_transaction(items) as working:
...   working.append(4)
...   working.append(5)
...
>>> items
[1, 2, 3, 4, 5]
>>> with list_transaction(items) as working:
...   working.append(6)
...   working.append(7)
...   raise RuntimeError('oops')
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
RuntimeError: oops
>>> items
[1, 2, 3, 4, 5]
>>>
토론 하 다.
일반적인 상황 에서 컨 텍스트 관리 자 를 쓰 려 면 클래스 를 정의 해 야 합 니 다.그 안에 이 포함 되 어 있 습 니 다.enter__() 하나exit__() 방법 은 다음 과 같다.

import time

class timethis:
  def __init__(self, label):
    self.label = label

  def __enter__(self):
    self.start = time.time()

  def __exit__(self, exc_ty, exc_val, exc_tb):
    end = time.time()
    print('{}: {}'.format(self.label, end - self.start))
이것 도 어렵 지 않 지만 간단 한 사용@contextmanager 주 해 를 쓰 는 함수 에 비해 조금 지루 하 다.@contextmanager포 함 된 문맥 관리 함수 만 써 야 합 니 다.만약 에 대상(예 를 들 어 파일,네트워크 연결 또는 잠 금)이 있 으 면 지원with 문 구 를 지원 해 야 한다.그러면 단독으로 __enter__() 방법 과__exit__() 방법 을 실현 해 야 한다.
이상 은 Python 이 컨 텍스트 관리 자 를 실현 하 는 방법 에 대한 상세 한 내용 입 니 다.Python 이 컨 텍스트 관리 자 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기