2017-05-03 4 views
0

파이썬의 source code of open부터, 나는 open이 정상적인 기능이라고 생각합니다.왜 컨텍스트 관리자로 open()을 사용할 수 있습니까?

왜 아래와 같이 사용할 수 있습니까?

with open('what_are_context_managers.txt', 'r') as infile: 
    for line in infile: 
     print('> {}'.format(line)) 

은 이후도 구현 __enter____exit__이고,도 contextlib.contextmanager 장식을 이용한다.

+5

함수에 의해 반환 된 원래'file' 유형은 컨텍스트 관리자 인터페이스를 구현합니다. –

답변

6

open 기능을 컨텍스트 관리자로 사용하지 않습니다. 컨텍스트 관리자 인 호출 식의 결과는 입니다. open()은 파일 객체를 반환하고 그 객체는 __enter____exit__ 메서드를가집니다.

IOBASE 또한 컨텍스트 매니저 때문에 문으로 지원하십시오 io.IOBase documentation를 참조하십시오.

는이 같은 with 문을 읽을 수 있습니다 : 그것은 여기 infile에 할당되는 끝 _context_manager.__enter__()의 반환 값이

_context_manager = open('what_are_context_managers.txt', 'r') 
with _context_manager as infile: 

하는 것으로. 파일 개체의 경우 file.__enter__()self을 반환하므로 동일한 개체에 대한 액세스 권한을 얻을 수 있습니다.


부수적으로; 너는 틀린 open() 기능을 얻었다. open() 내장의 실제 정의는 io.open()의 별칭입니다 (_iomodule.c source code 참조). 별칭은 initstdio() in pylifecycle.c (io.OpenWrapperitself an alias for _io.open)으로 설정됩니다. 그리고 예, 설명서에는 최종 사용자가 쉽게 사용할 수 있도록 별칭이 다른 방향으로 표시되어 있다고 나와 있습니다.