세부 사항은 약간의 기술적 얻을, 그래서 간단한 버전으로 시작하자 :
일부 유형은 with
문에 사용되는 방법을 알고있다. open
에서 반환하는 것과 같은 파일 객체는 이러한 유형의 예입니다. 밝혀진 바와 같이, urllib.request.urlopen
에서 되돌아온 객체는 이고 이러한 두 번째 예제는 첫 번째 예제와 같은 방식으로 작성 될 수 있습니다.
그러나 일부 유형은 with
문에 사용하는 방법을 알지 못합니다.closing
함수는 close
메서드를 사용하는 경우 이러한 형식을 래핑하도록 디자인되었으므로 with
문을 종료 할 때 close
메서드를 호출합니다. 자신의 정리 방법은 close
이름 (또는하지 않기 때문에 일부 유형은 또한 with
문에서 사용하는 방법을 알고하지 않습니다 물론
는 closing
사용할 수 없습니다를 청소 단지보다 더 복잡하기 때문에 그들을 폐쇄). 이 경우 사용자 정의 컨텍스트 관리자를 작성해야합니다. 그러나 심지어 그렇게 어렵지도 않습니다. 기술적 인 용어로
:
는
with
문은 context manager, __enter__
및 __exit__
방법과 객체가 필요합니다. __enter__
메서드를 호출하고 as
절에 해당 메서드에서 반환 된 값을 제공하면 with
문 끝에 __exit__
메서드가 호출됩니다.
파일 개체는 __enter__
메서드를 반환하는 컨텍스트 관리자 인 io.IOBase
에서 상속받으며 __exit__
은 self.close()
을 호출합니다.
urlopen
의해 리턴 된 객체는 문서 말했듯 "고 진술 with
함께 사용할 수있는,"HTTPResponse
, (AN http
https
URL 또는 가정)이다.
closing
기능 :
돌아 블록이 완료되면 일을 닫는 상황 매니저. 이것은 기본적으로 동일합니다 :
@contextmanager
def closing(thing):
try:
yield thing
finally:
thing.close()
그것의 종류의 상황에 맞는 관리자이며, 종류가 아닌 문서에서 항상 100 % 취소합니다. 특히 컨텍스트 관리자가 될 수있는 모든 것을 만들기 위해 3.1 이후 주요한 드라이브가 있었기 때문에 (그리고 의미가있는 경우 대부분은 파일과 같은 모든 것을 실제의 IOBase
으로 만들었습니다.) 그러나 여전히 그렇지 않습니다. 3.4에서 100 % 완료.
언제든지 시도해보고 볼 수 있습니다. AttributeError: __exit__
이 있으면 오브젝트를 컨텍스트 매니저로 사용할 수 없습니다. 그것이 있어야한다고 생각되면 변경을 제안하는 버그를 제출하십시오. 이 오류가 발생하지 않았지만 문서에 합법적이라고 언급되지 않으면 문서를 업데이트하라는 버그를 제출하십시오.
나는 누군가가 이것을 위해'contextlib'에 문서 버그를 제출해야한다는 것을 제안하려고했는데, 만약 당신이 누구 이건 당신에게 신용을 주어야한다고 ... 그러나 끝낼 수 있기 전에, Martijn은 벌써 버그를 링크와 함께 제출했다. 여기로. :) – abarnert