택시짱의 개발 노트

python Context manager 본문

python

python Context manager

택시짱 2020. 7. 18. 17:14

context manager


컨텍스트 매니저는 원하는 타이밍에 정확하게 리소스를 할당하고 제공하는 역할을 합니다. 가장 많이 사용되는 컨텍스트 매니저는with문입니다. 코드 블록 사이에서 한 쌍으로 함께 실행되어야 하는 연결된 수행 코드 2개를 가지고 있다고 생각 해보세요. 컨텍스트 매니저는 정확히 이런 것들을 가능하게 합니다. 예를 들면,

with open('hello.txt', 'w') as opened_file:
    opened_file.write('hello world')

위 코드는 파일을 열고 어떤 데이터들을 쓰고 닫는 코드입니다. 만약 데이터를 쓰는 동안 에러가 발생한다면, 파일을 닫으려고 시도할 것입니다. 위의 코드를 try, finally를 이용하여 만들어보면

file = open('hello.txt', 'w')

try:
    file.write('hello world')

finally:
    file.close()

첫 번째 예시와 두 번째 예시를 비교해보면 with를 이용하여 간단하게 코드를 작성할 수 있습니다. with 문을 이용한 큰 장점은 감싸진 블록에게 신경을 쓰지 않아도 파일은 확실히 close가 된다는것 입니다.

그래서 일반적으로 파일을 open, close할때는 context manager를 사용합니다.

Class로 context manager 향상시키기.


최소한 context manager는 __enter____exit 메소드를 가지고 있습니다. 파일을 여는 context manager를 만들어보면서 살펴봅시다.

class File(object):
    def __init__(self, file_name, method):
        self.file_obj = open(file_name, method)

    def __enter__(self):
        return self.file_obj

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file_obj.close()

방금 정의한 __entet__ 문과 __exit 문을 with문으로 사용할 수 있습니다.

 with File('hello.txt', 'w') as opened_file:
     opened_file.write('hello world')

__exit__ 함수는 세 가지 전달 인자를 받습니다. 컨텍스트 매니저 class의 일부인 모든 __exit__ 메소드에 필요합니다.

__enter__with 문에 진입하는 시점에 자동으로 호출됩니다.

__exit__with 문이 끝나기 직전에 자동으로 호출됩니다.

__exit__ 메소드가 받는 세 개의 인자는 해당 객체와 연관된 context내에서 예외가 발생되었을 때, 해당 예외에 관한 정보이다. 만약에 예외 없이 with 구문이 종료가 되었다면 이 세 인자는 모두 None이 될 것이다.





reference link [https://ddanggle.gitbooks.io/interpy-kr/ch24-context-manager.html]

반응형

'python' 카테고리의 다른 글

python heapq 모듈  (0) 2020.09.08
python 입력 받기  (0) 2020.08.31
ubuntu에서 git bash 설치하기  (0) 2020.07.15
ubuntu에서 pycharm 설치 및 실행  (0) 2020.07.15
python 끄적끄적  (0) 2020.04.28
Comments