앞서 작성한 포스트는 파이썬에서 with을 어떻게 사용하는지 작성했습니다.
이번 포스팅은 with 구문에 사용할 수 있는 객체의 타입인 Context Manager를 정리한 글입니다.
| Context Manager란?
https://peps.python.org/pep-0343/#context-managers-in-the-standard-library
- python document에 설명되어 있는 context manager입니다.
__enter__() 메서드 및 __exit__() 메서드를 정의하여 with 문에 표시되는 환경을 제어하는 개체라고 설명되어 있으며 자세한 내용은 첨부된 링크를 확인해보세요!
- __enter__과 __exit__ 는 클래스의 __init__ 같은 특정한 기능을 사용하기 위해 이미 설계된 메서드입니다.
__enter__(self) : with 구문에 진입되는 시점에 자동으로 호출
__exit__(self, type, value, trackback) : with 구문에서 빠져나오기 직전에 호출되며 인자들은 예외가 발생했을 때 정보를 담고 있고 예외 없이 실행됐다면 None의 값을 가짐
이렇게 설명할 수 있습니다.
| with 구문에서 Class 사용
- with as 구문에서 우리가 원하는 class를 사용할 수 있습니다.
예시) 지금 시간을 file에 쓰는 클래스를 구현
from datetime import datetime
class writeTime :
def __init__(self, fileName) :
self.fileName = fileName
def nowTimeWrite(self) :
nowTime = datetime.now()
nowTime = f'{nowTime.year}-{nowTime.month}-{nowTime.day}, {nowTime.hour}:{nowTime.minute}:{nowTime.second}'
self.file.write(nowTime + '\n')
def __enter__(self):
self.file = open(self.fileName, 'a')
return self
def __exit__(self, type, value, trackback) :
self.file.write('__exit__ called' + '\n')
self.file.close()
- __init__ 메서드로 fileName 즉, 파일 경로 및 이름을 초기화하고 nowTimeWrite에서 datetime 패키지의 now 메서드를 이용해 실행했을 때의 시간을 받아옵니다. 그리고 __enter__ 에서 return 한 객체는 as 이후에 지정한 변수에 들어가게 됩니다. __exit__에는 file.close를 넣어 예외가 발생하더라도 close가 실행되게 만들었습니다.
결과)
- now로 만든 현재 시각을 write 한 것을 알 수 있고 exit 메서드도 정상적으로 실행한 것을 확인했습니다.
앞서 정리했던 with 구문을 더욱 활용할 수 있는 context manager인 __enter__, __exit__ 메서드를 정리했습니다
이것은 log를 정리하거나 DB를 관리할 때 더욱 용이하게 쓰일 것 같다고 생각합니다.
틀린 점이나 질문이 있으시면 댓글로 남겨주세요!
감사합니다 :)
'Python > Python 정리' 카테고리의 다른 글
[Python] os.path를 활용한 파일, 디렉터리 관리 (0) | 2022.07.03 |
---|---|
[Python] os 모듈 (0) | 2022.07.02 |
[Python] with 구문 이해 (2) | 2022.06.10 |
[Python] for ~ else 문 정리 (0) | 2022.06.09 |
[Python] filter() 함수 정리 (0) | 2022.06.08 |