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 이 컨 텍스트 관리 자 를 실현 하 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.