>  기사  >  백엔드 개발  >  Python 기본 튜토리얼에서 with 및 contextlib의 사용 예에 ​​대한 자세한 설명

Python 기본 튜토리얼에서 with 및 contextlib의 사용 예에 ​​대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-08-09 11:02:251602검색

이 글은 주로 Python에서의 with와 contextlib의 사용법을 소개합니다. with와 contextlib의 기능, 사용 방법, 관련 주의사항을 예제 형식으로 자세히 분석합니다. 도움이 필요한 친구들은 참고할 수 있습니다.

본 글의 예제 Python에서 with 및 contextlib의 사용법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

일반적인 코딩 과정에서 자주 사용되는 with 시나리오는 파일 처리를 위해 파일을 연 다음 암시적으로 파일 핸들 닫기를 실행하는 것입니다. 이 클래스는 모두 with를 지원합니다.


with file('test.py','r') as f :
  print f.readline()

with의 역할은 with를 적용하는 try...finally...와 유사합니다. 문에서 클래스는 두 개의 내장 함수 __enter__ 및 __exit__를 제공해야 합니다. 전자는 메인 코드가 실행되기 전에 실행되고, 후자는 메인 코드가 실행된 후에 실행됩니다. as 뒤의 변수는 __enter__ 함수에 반환됩니다. 다음 코드 조각과 주석을 통해 __enter__ 및 __exit__의 사용법을 명확하게 이해할 수 있습니다.


#!encoding:utf-8
class echo :
  def output(self) :
    print 'hello world'
  def __enter__(self):
    print 'enter'
    return self #返回自身实例,当然也可以返回任何希望返回的东西
  def __exit__(self, exception_type, exception_value, exception_traceback):
    #若发生异常,会在这里捕捉到,可以进行异常处理
    print 'exit'
    #如果改__exit__可以处理改异常则通过返回True告知该异常不必传播,否则返回False
    if exception_type == ValueError :
      return True
    else:
      return False
with echo() as e:
  e.output()
  print 'do something inside'
print '-----------'
with echo() as e:
  raise ValueError('value error')
print '-----------'
with echo() as e:
  raise Exception('can not detect')

실행 결과:

contextlib는 with 문을 강화하고 컨텍스트 메커니즘을 제공하는 모듈입니다. Generator를 통해 구현됩니다. 클래스를 정의하고 __enter__ 및 __exit__를 작성하여 컨텍스트를 관리하는 것은 어렵지 않지만 지루합니다. contextlib의 contextmanager는 기능 수준 컨텍스트 관리 메커니즘을 제공하는 데코레이터 역할을 합니다. 일반적으로 사용되는 프레임워크는 다음과 같습니다.


from contextlib import contextmanager
@contextmanager
def make_context() :
  print 'enter'
  try :
    yield {}
  except RuntimeError, err :
    print 'error' , err
  finally :
    print 'exit'
with make_context() as value :
  print value

contextlib에는 두 가지 중요한 사항이 있습니다. 하나는 중첩되고 다른 하나는 닫히는 것입니다. 전자는 중첩된 컨텍스트를 만드는 데 사용되고 후자는 정의된 닫기를 실행하는 데 사용됩니다. 기능. 그러나 중첩은 더 이상 사용되지 않습니다. 왜냐하면 with는 이미 여러 컨텍스트를 통해 직접 중첩될 수 있기 때문입니다. 예는 다음과 같습니다.


from contextlib import contextmanager
from contextlib import nested
from contextlib import closing
@contextmanager
def make_context(name) :
  print 'enter', name
  yield name
  print 'exit', name
with nested(make_context('A'), make_context('B')) as (a, b) :
  print a
  print b
with make_context('A') as a, make_context('B') as b :
  print a
  print b
class Door(object) :
  def open(self) :
    print 'Door is opened'
  def close(self) :
    print 'Door is closed'
with closing(Door()) as door :
  door.open()

실행 결과:

요약: Python에는 일반적으로 C++ 또는 Java의 일부 프로그래밍 습관에 익숙하기 때문에 이러한 좋은 기능을 종종 무시합니다. 기구. 그러므로 우리는 우리가 작성하는 Python 프로그램을 Python과 더 유사하게 만들기 위해 이러한 Python 기능을 사용하는 방법을 배워야 합니다.

위 내용은 Python 기본 튜토리얼에서 with 및 contextlib의 사용 예에 ​​대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.