Context(문맥)
이라는 단어가 참 많은 곳에서 사용되기 때문에 조금 애매하지만, 아무튼 Python의 특정 객체들은 context를 가집니다. 예를 들어, file 객체는 open-close의 2가지 context를 가지는 식입니다.
file 객체의 open과 close처럼, context가 명확한 객체의 경우 Python에서는 원하는 타이밍에 정확하게 리소스를 할당하고 제거할 수 있도록 context manager 프로토콜을 갖도록 하는 것을 권고하고 있습니다. 'context manager 프로토콜을 가지고 있다'의 조건은 생각보다 간단합니다.
- 매직 메소드
__enter__()
를 구현하고 있어야 한다. - 매직 메소드
__exit__()
을 구현하고 있어야 한다.
이 두 매직 메소드들은 가장 일반적인 context manager인 with-as
문에서 사용됩니다.
with
문에 의해 감싸진 객체는, 블럭이 시작되기 이전에 as
뒤의 객체에 __enter__()의 반환값을 할당하며, 블럭을 탈출하는 시점에 해당 객체의 __exit__()을 호출합니다. file의 경우, __enter__()에서 파일 객체를 열어 반환하고, __exit__()에서 파일 객체를 닫는(close) 역할을 하므로 context manageable
하다고 말할 수 있습니다.
Context manageable한 클래스 만들기
__enter__()와 __exit__()이 정의된, context manageable한 클래스를 만들고 with-as 문에 사용해 보겠습니다.
역시, Python은 생각보다 훨씬 깊습니다.
'Python 계열 > Python 레거시 글' 카테고리의 다른 글
pip (0) | 2018.11.05 |
---|---|
__slots__ (0) | 2018.11.03 |
Argument Unpacking (0) | 2018.10.30 |
[Python] zip (0) | 2018.07.28 |
[Python] Coroutines (0) | 2018.07.27 |