우리 중 많은 사람들이 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(...)
컨텍스트 관리자를 구현하는 두 번째 방법은 다음과 같이 데코레이터를 사용하는 것입니다.
위 소개에 따라 데코레이터 컨텍스트 관리자를 작성해 보겠습니다!
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!