Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

with-statement 컨텍스트를 위한 Python 유틸리티(contextlib)

<시간/>

Python 표준 라이브러리의 contextlib 모듈은 프로그램 내의 리소스를 적절하게 관리하는 객체를 가진 ContextManager 클래스를 정의합니다. Python에는 컨텍스트 관리자와 함께 작동하는 with 키워드가 있습니다. 파일 객체(내장된 open() 함수에 의해 반환됨)는 ContextManager API를 지원합니다. 따라서 파일 작업을 할 때 사용하는 키워드로 자주 찾습니다.

다음 코드 블록은 파일을 열고 그 안에 일부 데이터를 씁니다. 작업이 끝나면 파일이 닫히고 어떤 파일 설명자가 누출되어 파일 손상을 일으킬 수 있는지 실패합니다.

f = open("file.txt","w")
f.write("hello world")
f.close()

그러나 다음 구문을 사용하여 파일의 컨텍스트 관리자 기능을 사용하여 동일한 파일 작업이 수행됩니다.

with open("file.txt","w") as f:
f.write("hello world")
print ("file is closed")

위에서 언급했듯이 파일 개체는 ContextManager를 구현합니다. with 키워드에 의해 활성화됩니다. with 블록에는 파일 개체에 대해 처리할 명령문이 포함되어 있습니다. with 블록이 끝나자 마자 파일 객체가 자동으로 닫힙니다(close() 메서드는 명시적으로 호출할 필요가 없습니다). with block 대상이 되는 모든 객체는 블록 내에서만 활성화되며 블록의 끝에서 즉시 폐기됩니다.

ContextManager 클래스에는 두 가지 필수 메서드 __enter__() 및 __exit__()

가 있습니다.

__enter__() - 블록이 시작될 때 호출됩니다. 프로그램이 이 개체와 관련된 런타임 컨텍스트에 진입했음을 나타냅니다.

__exit__() - with 블록이 끝나면 호출됩니다. 프로그램이 이 개체와 관련된 런타임 컨텍스트를 종료함을 나타냅니다.

파일 객체 역시 다음 인터프리터 세션을 통해 확인할 수 있는 이 두 가지 방법을 가지고 있습니다.

>>> f = open("file.txt","w")
>>> f.__enter__()
<_io.TextIOWrapper name = 'file.txt' mode = 'w' encoding = 'cp1252'>
>>> f.write("hello world")
11
>>> f.__exit__()
>>> f.write("hello world")
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
f.write("hello world")
ValueError: I/O operation on closed file.

__exit__() 메서드가 호출되면 파일이 닫힙니다. 이것이 파일을 닫은 후 파일에 일부 데이터를 쓰려고 할 때 ValueError가 나타나는 이유입니다.

다음은 contextManager의 보다 일반적인 사용입니다. 먼저 __enter__() 및 __exit__() 메서드를 사용하여 클래스를 정의하고 with 문을 사용하여 해당 개체에 대해 contextManager를 활성화합니다.

import contextlib
class WithExample:
   def __init__(self):
      print ("object initialized")
   def __enter__(self):
      print ("entered context")
   def __exit__(self, *args):
      print ("exited context")
with WithExample() as w:
print ('this is a contextlib example')
print ('used by with statement')
print ('end of with block')

출력은 with 블록이 시작되자마자 __enter__() 메서드가 실행됨을 보여줍니다. 블록 내의 명령문이 처리됩니다. 블록이 끝나면 __exit__() 메서드가 자동으로 호출됩니다.

object initialized
entered context
this is a contextlib example
used by with statement
exited context
end of with block

contextlib 모듈에는 @contextmanager 데코레이터가 있어 with 문을 자동으로 지원하는 생성기 기반 팩토리 함수를 작성할 수 있습니다. 데코레이터를 사용한 파일 객체의 컨텍스트 관리는 다음과 같습니다 -

from contextlib import contextmanager
@contextmanager
def openfile(name):
   try:
      f = open(name, 'w')
      yield f
   finally:
      f.close()
with openfile(file.txt') as f:
f.write('hello world')
print ('file is closed')

따라서 ContextManager는 프로그램의 리소스를 효과적으로 관리하기 위한 Python의 매우 유용한 기능입니다.