백엔드 개발 파이썬 튜토리얼 Python의 with 문과 컨텍스트 관리자

Python의 with 문과 컨텍스트 관리자

Mar 01, 2017 pm 02:15 PM

Python의 컨텍스트 관리자 객체로 with 문을 사용할 수 있습니다. 컨텍스트 관리자를 제공하는 contextlib 모듈을 사용하는 것은 Python 프로그래밍의 고급 기술입니다. Python. 머신러닝 요약:

0. 컨텍스트 관리자에 대하여
컨텍스트 관리자는 with 문에서 사용할 수 있는 객체이며 __enter__ 및 __exit__ 메서드를 가지고 있습니다.

with manager as var:
  do_something(var)
로그인 후 복사

var = manager.__enter__()
try:
  do_something(var)
finally:
  manager.__exit__()
로그인 후 복사

를 단순화한 것과 같습니다. PEP 343 정의된 컨텍스트 관리자 프로토콜을 사용하면 지루한 try...out...finally 구조를 별도의 클래스로 추상화하여 do_something 부분만 고려하도록 허용합니다.

__enter__ 메소드가 먼저 호출됩니다. var에 할당된 값을 반환할 수 있습니다. as 부분은 선택 사항입니다. 표시되지 않으면 Enter의 반환 값은 무시됩니다.
with 문 아래의 코드가 실행됩니다. try 절과 마찬가지로 성공적으로 실행되거나 중단, 계속 또는 반환되거나 예외가 발생할 수 있습니다. 두 경우 모두 블록이 끝난 후 __exit__ 메서드가 호출됩니다. 예외가 발생하면 예외 정보는 다음 섹션에서 설명하는 __exit__로 전달됩니다. 일반적으로 예외는 finally 절에서와 같이 무시될 수 있으며 __exit__가 끝난 후에 다시 발생합니다.
쓰기 작업이 완료된 후 즉시 파일이 닫히는지 확인하고 싶다고 가정해 보겠습니다.

>>> class closing(object):
...  def __init__(self, obj):
...   self.obj = obj
...  def __enter__(self):
...   return self.obj
...  def __exit__(self, *args):
...   self.obj.close()
>>> with closing(open('/tmp/file', 'w')) as f:
...  f.write('the contents\n')
로그인 후 복사

여기서는 다음과 같은 작업이 완료될 때 f가 호출되는지 확인합니다. 블록이 있으면 .close()가 종료됩니다. 파일을 닫는 것은 매우 일반적인 작업이므로 이 지원은 이미 파일 클래스에 있습니다. close를 호출하고 컨텍스트 관리자 자체로 작동하는 __exit__ 메서드가 있습니다.

>>> with open('/tmp/file', 'a') as f:
...  f.write('more contents\n')
로그인 후 복사

try...마지막으로 일반적인 사용법은 리소스를 해제하는 것입니다. 다양한 상황은 유사하게 구현됩니다. 리소스는 __enter__ 단계에서 획득되고 __exit__ 단계에서 해제되며, 예외가 발생하면 예외도 전달됩니다. 파일 작업과 마찬가지로 객체를 사용한 후 자연스러운 작업인 경우가 많으며 기본 지원으로 편리합니다. 각 버전마다 Python이 더 많은 곳에서 지원됩니다.

1. 컨텍스트 관리자 사용 방법:

파일 열기 및 "hello world" 작성 방법

filename="my.txt"
mode="w"
writer=open(filename,mode)
writer.write("hello world")
writer.close()
로그인 후 복사

예외가 발생하면(예: 디스크가 가득 찬 경우) 5행을 실행할 기회가 없습니다. 물론, 패키징을 위해 try-finally 문 블록을 사용할 수 있습니다:

writer=open(filename,mode)
try:
  writer.write("hello world")
finally:
  writer.close()
로그인 후 복사

복잡한 작업을 수행할 때 try-finally 문은 보기 흉해집니다. with 문:

with open(filename,mode) as writer:
  writer.write("hello world")
로그인 후 복사

as는 open() 함수에서 반환된 콘텐츠를 참조하고 이를 새 값에 할당합니다. try-finally 작업을 완료합니다.

2. 사용자 정의 컨텍스트 관리자

with 문은 try-finally와 유사하며 컨텍스트 메커니즘을 제공합니다. with 문을 적용하려면 클래스는 두 개의 내장 함수 __enter__ 및 __exit__를 제공해야 합니다. 전자는 메인 코드가 실행되기 전에 실행되고, 후자는 메인 코드가 실행된 후에 실행됩니다. as 뒤의 변수는 __enter__ 함수에 반환됩니다.

class echo():
  def output(self):
    print "hello world"
  def __enter__(self):
    print "enter"
    return self #可以返回任何希望返回的东西
  def __exit__(self,exception_type,value,trackback):
    print "exit"
    if exception_type==ValueError:
      return True
    else:
      return Flase
 
>>>with echo as e:
  e.output()
로그인 후 복사


출력:

enter
hello world
exit
로그인 후 복사

__exit_ _함수 완료

def __exit__(self,exc_type,exc_value,exc_tb)
로그인 후 복사

그 중, ex_type: 예외 유형; ex_value: 예외 값; ex_tb: 예외 추적 정보

When __exit__ True가 반환되고 예외가 전파되지 않습니다.

3. contextlib 모듈

contextlib 모듈의 역할은 사용하기 쉬운 컨텍스트 관리자를 제공하는 것입니다. Generator를 통해 구현됩니다. contextlib의 contextmanager는 함수 수준 컨텍스트 관리 메커니즘을 제공하는 데코레이터 역할을 합니다. 일반적으로 사용되는 프레임워크는 다음과 같습니다.

from contextlib import contextmanager
@contextmanager
def make_context():
  print 'enter'
  try:
    yield "ok"
  except RuntimeError,err:
    print 'error',err
  finally:
    print 'exit'
    
>>>with make_context() as value:
  print value
로그인 후 복사


출력은 다음과 같습니다. :

  enter
  ok
  exit
로그인 후 복사

그중 Yield는 예외 안전성을 보장하기 위해 try-finally로 작성됩니다(예외 처리 가능). 수익률로 반환됩니다. 항복 이전의 명령문은 코드 블록이 실행되기 전의 연산으로 간주할 수 있고, 항복 이후의 연산은 __exit__ 함수 내에서의 연산으로 간주할 수 있습니다.

스레드 잠금을 예로 들어보세요:

@contextlib.contextmanager
def loudLock():
  print 'Locking'
  lock.acquire()
  yield
  print 'Releasing'
  lock.release()
 
with loudLock():
  print 'Lock is locked: %s' % lock.locked()
  print 'Doing something that needs locking'
 
#Output:
#Locking
#Lock is locked: True
#Doing something that needs locking
#Releasing
로그인 후 복사

4. contextlib.nested: 중첩 줄이기

대상:

with open(filename,mode) as reader:
  with open(filename1,mode1) as writer:
    writer.write(reader.read())
로그인 후 복사

는 contextlib.nested로 단순화할 수 있습니다.

with contextlib.nested(open(filename,mode),open(filename1,mode1)) as (reader,writer):
  writer.write(reader.read())
로그인 후 복사

Python 2.7 이상에서는 새로운 구문으로 대체됩니다:

with open(filename,mode) as reader,open(filename1,mode1) as writer:
  writer.write(reader.read())
로그인 후 복사

5, contextlib.closing()

파일 클래스는 컨텍스트 관리자 API를 직접 지원하지만 urllib.urlopen()에서 반환된 객체와 같이 열린 핸들을 나타내는 일부 객체는 지원되지 않습니다. close() 메서드를 사용하지만 컨텍스트 관리자 API를 지원하지 않는 일부 레거시 클래스도 있습니다. 핸들이 닫혔는지 확인하려면 Closing()(클래스의 close 메서드 호출)을 사용하여 핸들에 대한 컨텍스트 관리자를 만들어야 합니다.

import contextlib
class myclass():
  def __init__(self):
    print '__init__'
  def close(self):
    print 'close()'
   
with contextlib.closing(myclass()):
  print 'ok'
로그인 후 복사


출력:

__init__
ok
close()
로그인 후 복사


Python의 with문과 컨텍스트 관리자에 관한 더 많은 글을 보시려면 PHP 중국어 홈페이지를 주목해주세요!

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Python을 사용하여 텍스트 파일의 ZIPF 배포를 찾는 방법 Mar 05, 2025 am 09:58 AM

이 튜토리얼은 Python을 사용하여 Zipf의 법칙의 통계 개념을 처리하는 방법을 보여주고 법을 처리 할 때 Python의 읽기 및 대형 텍스트 파일을 정렬하는 효율성을 보여줍니다. ZIPF 분포라는 용어가 무엇을 의미하는지 궁금 할 것입니다. 이 용어를 이해하려면 먼저 Zipf의 법칙을 정의해야합니다. 걱정하지 마세요. 지침을 단순화하려고 노력할 것입니다. Zipf의 법칙 Zipf의 법칙은 단순히 : 큰 자연어 코퍼스에서 가장 자주 발생하는 단어는 두 번째 빈번한 단어, 세 번째 빈번한 단어보다 세 번, 네 번째 빈번한 단어 등 4 배나 자주 발생합니다. 예를 살펴 보겠습니다. 미국 영어로 브라운 코퍼스를 보면 가장 빈번한 단어는 "TH입니다.

HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? HTML을 구문 분석하기 위해 아름다운 수프를 어떻게 사용합니까? Mar 10, 2025 pm 06:54 PM

이 기사에서는 HTML을 구문 분석하기 위해 파이썬 라이브러리 인 아름다운 수프를 사용하는 방법을 설명합니다. 데이터 추출, 다양한 HTML 구조 및 오류 처리 및 대안 (SEL과 같은 Find (), find_all (), select () 및 get_text ()와 같은 일반적인 방법을 자세히 설명합니다.

파이썬에서 파일을 다운로드하는 방법 파이썬에서 파일을 다운로드하는 방법 Mar 01, 2025 am 10:03 AM

Python은 인터넷에서 파일을 다운로드하는 다양한 방법을 제공하며 Urllib 패키지 또는 요청 도서관을 사용하여 HTTP를 통해 다운로드 할 수 있습니다. 이 튜토리얼은 이러한 라이브러리를 사용하여 Python의 URL에서 파일을 다운로드하는 방법을 설명합니다. 도서관을 요청합니다 요청은 Python에서 가장 인기있는 라이브러리 중 하나입니다. URL에 쿼리 문자열을 수동으로 추가하지 않고 HTTP/1.1 요청을 보낼 수 있습니다. 요청 라이브러리는 다음을 포함하여 많은 기능을 수행 할 수 있습니다. 양식 데이터 추가 다중 부문 파일을 추가하십시오 파이썬 응답 데이터에 액세스하십시오 요청하십시오 머리

파이썬의 이미지 필터링 파이썬의 이미지 필터링 Mar 03, 2025 am 09:44 AM

시끄러운 이미지를 다루는 것은 특히 휴대폰 또는 저해상도 카메라 사진에서 일반적인 문제입니다. 이 튜토리얼은 OpenCV를 사용 하여이 문제를 해결하기 위해 Python의 이미지 필터링 기술을 탐구합니다. 이미지 필터링 : 강력한 도구 이미지 필터

Python을 사용하여 PDF 문서를 사용하는 방법 Python을 사용하여 PDF 문서를 사용하는 방법 Mar 02, 2025 am 09:54 AM

PDF 파일은 운영 체제, 읽기 장치 및 소프트웨어 전체에서 일관된 콘텐츠 및 레이아웃과 함께 크로스 플랫폼 호환성에 인기가 있습니다. 그러나 Python Processing Plain Text 파일과 달리 PDF 파일은 더 복잡한 구조를 가진 이진 파일이며 글꼴, 색상 및 이미지와 같은 요소를 포함합니다. 다행히도 Python의 외부 모듈로 PDF 파일을 처리하는 것은 어렵지 않습니다. 이 기사는 PYPDF2 모듈을 사용하여 PDF 파일을 열고 페이지를 인쇄하고 텍스트를 추출하는 방법을 보여줍니다. PDF 파일의 생성 및 편집에 대해서는 저의 다른 튜토리얼을 참조하십시오. 준비 핵심은 외부 모듈 PYPDF2를 사용하는 데 있습니다. 먼저 PIP를 사용하여 설치하십시오. PIP는 p입니다

Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Django 응용 프로그램에서 Redis를 사용하여 캐시하는 방법 Mar 02, 2025 am 10:10 AM

이 튜토리얼은 Redis 캐싱을 활용하여 특히 Django 프레임 워크 내에서 Python 응용 프로그램의 성능을 향상시키는 방법을 보여줍니다. 우리는 Redis 설치, Django 구성 및 성능 비교를 다루어 Bene을 강조합니다.

NLTK (Natural Language Toolkit) 소개 NLTK (Natural Language Toolkit) 소개 Mar 01, 2025 am 10:05 AM

NLP (Natural Language Processing)는 인간 언어의 자동 또는 반자동 처리입니다. NLP는 언어학과 밀접한 관련이 있으며인지 과학, 심리학, 생리학 및 수학에 대한 연구와 관련이 있습니다. 컴퓨터 과학에서

Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Tensorflow 또는 Pytorch로 딥 러닝을 수행하는 방법은 무엇입니까? Mar 10, 2025 pm 06:52 PM

이 기사는 딥 러닝을 위해 텐서 플로와 Pytorch를 비교합니다. 데이터 준비, 모델 구축, 교육, 평가 및 배포와 관련된 단계에 대해 자세히 설명합니다. 프레임 워크, 특히 계산 포도와 관련하여 주요 차이점

See all articles