with
정리해야 할 리소스를 관리하기 위해 Python의 문장을 사용하는 것이 좋습니다 . 명시 적 close()
문 을 사용할 때의 문제점 finally
은 예외가 발생했을 때 리소스 누수를 방지하기 위해 호출을 잊어 버리거나 블록에 배치하는 것을 잊어 버린 사람들에 대해 걱정해야한다는 것 입니다.
with
명령문 을 사용하려면 다음 메소드를 사용하여 클래스를 작성하십시오.
def __enter__(self)
def __exit__(self, exc_type, exc_value, traceback)
위의 예에서는
class Package:
def __init__(self):
self.files = []
def __enter__(self):
return self
# ...
def __exit__(self, exc_type, exc_value, traceback):
for file in self.files:
os.unlink(file)
그런 다음 누군가 수업을 사용하고 싶을 때 다음을 수행합니다.
with Package() as package_obj:
# use package_obj
변수 package_obj는 패키지 유형의 인스턴스입니다 ( __enter__
메소드가 반환 한 값 ). 그 __exit__
방법에 관계없이 자동으로 예외가 발생 여부에 호출됩니다.
이 접근법을 한 단계 더 발전시킬 수도 있습니다. 위의 예에서 누군가는 with
절 을 사용하지 않고 생성자를 사용하여 패키지를 인스턴스화 할 수 있습니다 . 당신은 그런 일이 일어나기를 원하지 않습니다. __enter__
및 __exit__
메소드 를 정의하는 PackageResource 클래스를 작성하여이 문제를 해결할 수 있습니다 . 그런 다음 Package 클래스는 __enter__
메소드 내부에 엄격하게 정의 되어 리턴됩니다. 이렇게하면 호출자는 with
명령문 을 사용하지 않고 Package 클래스를 인스턴스화 할 수 없습니다 .
class PackageResource:
def __enter__(self):
class Package:
...
self.package_obj = Package()
return self.package_obj
def __exit__(self, exc_type, exc_value, traceback):
self.package_obj.cleanup()
다음과 같이 사용하십시오.
with PackageResource() as package_obj:
# use package_obj