>  기사  >  백엔드 개발  >  Python에서 with 키워드 이해하기

Python에서 with 키워드 이해하기

PHPz
PHPz앞으로
2023-04-14 11:31:061167검색

Python에서 with 키워드 이해하기

우리 중 많은 사람들이 Python 코드에서 이 코드 조각을 반복해서 보았습니다:

with open('Hi.text', 'w') as f:
f.write("Hello, there")

그러나 우리 중 일부는 with가 무엇을 위해 사용되는지, 왜 여기서 사용해야 하는지 모릅니다. 이 글을 읽으면 해결 가능한 거의 모든 문제에 대해 알게 될 것입니다. 시작하자!

먼저 with 키워드를 사용하지 않고 해야 할 일이 무엇인지 생각해 봅시다. 이 경우 먼저 파일을 열고 쓰기를 시도해야 합니다. 성공이든 실패든 관계없이 마지막에 닫는 것이 좋습니다. 그러면 코드는 다음과 같습니다.

f = open('Hi.text', 'w')
try:
f.write('Hello, there')
finally:
f.close()

그렇다면 with 키워드는 어떻게 사용되나요? 이는 try..finally 코드를 단일 with... 문으로 줄이는 데 도움이 됩니다! 이것이 with 문이 사용되는 방법입니다.

그럼 정확히 무엇인가요? 사실 with 문 자체는 Python에서 특별한 것이 아니며 단지 Python의 컨텍스트 관리자의 기능일 뿐입니다. 공식 Python 문서에서 인용된 컨텍스트 관리자는 필요할 때 정확하게 리소스를 할당하고 해제할 수 있는 방법입니다. 간단히 말해서 일부 리소스에 대해 작업을 수행할 때 코드 조각을 짧게 하면 다음과 같이 사용법을 정의할 수 있습니다. with 문을 직접 사용해보세요!

이것을 어떻게 하나요? 간단합니다. 두 가지 마법 함수를 구현하면 됩니다. 하나는 __enter__이고 다른 하나는 __exit__입니다. 첫 번째 방법은 아래와 같이 이 두 함수를 구현하는 클래스를 작성하는 것입니다.

class My_file:
def __init__(self, fname):
self.fname = fname
def __enter__(self):
self.file = open(self.fname, 'w')
return self.file
def __exit__(self, exc_type, exc_val, exc_trace_back):
if self.file:
self.file.close()

여기에서는 두 가지 마법 함수를 구현하는 일반 Python 클래스를 만들었습니다. 이 두 함수의 서명에 유의하세요. __enter__는 self만 허용하는 반면 __exit__는 더 많은 인수를 허용합니다. 예제의 세 개는 표준 형식입니다. 이런 방식으로 다음을 직접 사용할 수 있습니다.

with My_file('hello.txt') as f:
f.write('hello, world!')

여기서 with 문은 먼저 __init__을 호출하여 새 객체를 생성한 다음 __enter__ 메서드를 호출합니다. 마지막으로 코드 블록이 완료되기 전에 __exit__ 메서드를 트리거합니다. 따라서 위 코드의 대략적인 내용은 다음과 같습니다.

myfile = My_file('hello.txt')
f = myfile.__enter__()
f.write('hello, world!')
myfile.__exit(...)

컨텍스트 관리자를 구현하는 두 번째 방법은 다음과 같이 데코레이터를 사용하는 것입니다.

  1. contextlib에서 contextmanager를 가져옵니다
  2. 원하는 것을 달성하기 위한 함수를 작성합니다. 성명을 원합니다.
  3. 함수 위에 데코레이터 @contextmanager를 추가하세요.
  4. your_function과 함께 사용해보세요!

위 소개에 따라 데코레이터 컨텍스트 관리자를 작성해 보겠습니다!

from contextlib import contextmanager
@contextmanager
def my_file_open(fname):
try:
f = open(fname, 'w')
yield f
finally:
print('Closing file')
f.close()
with file_open('hi.txt') as f:
f.write('hello world')

위 내용은 with 문과 컨텍스트 관리자의 모든 기본 사항을 거의 다 다루고 있습니다. 하지만 더 자세히 알아보고 싶다면 계속 진행하세요...!

contextlib에는 사용할 수 있는 몇 가지 편리한 도구가 있습니다. 첫 번째 는 닫힙니다 . 닫기는 기본적으로 코드 블록을 종료하기 전에 구현하는 다른 함수로 래핑합니다.

@contextmanager
def closing(f):
try:
f.write("Finish writing")
finally:
f.close()
with closing(open("hi.text")):
f.write("hello world")

예를 들어 위 코드에서는 아래에 작성한 코드 블록이 완료되기 직전(f.write("hello world")) close(your_way_of_getting_resource)를 직접 호출할 수 있으며 try..가 실행됩니다. 마지막으로 위에서 정의한 블록을 사용합니다.

다른 하나는 억제 도구를 사용하는 것입니다. 많은 경우 리소스를 얻으려고 하면 파일을 열 때 FileNotFoundException과 같은 오류가 발생할 가능성이 높습니다. 어떤 경우에는 프로그램이 계속해서 정상적으로 실행될 수 있도록 오류를 포착하거나 억제하고 싶습니다. 억제는 경고를 억제할 수 있는 한 가지 방법입니다. 당신이 해야 할 일은 억제하고 싶은 예외가 무엇인지 파악하고 억제(your_choice_of_Exception)를 사용하여 작성하는 것뿐입니다. 그러면 Python이 거기에서 그것을 처리할 것입니다.

다른 경우에는 with 블록을 입력할 때 특정 작업만 수행하고 싶을 수도 있습니다. 이 경우에는 nullcontext가 편리할 것입니다. nullcontext는 __enter__ 함수에서 정의한 내용만 반환하고 다른 작업은 수행하지 않습니다. 리소스에 액세스하기 위해 Python에서 비동기 작업을 처리하는 경우 aclosure는 이러한 상황을 처리하기 위한 유틸리티입니다.

요약

이 문서에서는 with 문의 몇 가지 기본 개념과 사용법, 그리고 기본 작동 원리를 소개합니다. 더 흥미로운 내용이 많이 있습니다. Python의 contextlib 문서를 확인하세요. 마지막으로, 언제나처럼 행복한 학습과 행복한 코딩을 기원합니다!

위 내용은 Python에서 with 키워드 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제