Jay's Cookbook
Menu
  • Tags
  • Categories
  • Projects
Computer Science
OS
Network
Data Structure
Algorithm
Language
Code Architecture
Python
Javascript
Typescript
Java
Backend
Backend Theory
TypeORM
Node.js
NestJS
FastAPI
Frontend
HTML/CSS
React
Next.js
Data Engineering
DE Theory
MySQL
MongoDB
Elastic
Redis
Kafka
Spark
Airflow
AI
Basic
Pytorch
NLP
Computer Vision
Data Analytics
Statistics
Pandas
Matplotlib
DevOps
Git
Docker
Kubernetes
AWS
Python Basic Series [Part8]: 파이썬의 컨텍스트 매니저
language
python

Python Basic Series [Part8]: 파이썬의 컨텍스트 매니저

Jay Kim
Jay Kim 23 Mar 2021
Python Basic Series [Part7]: 파이썬의 네임스페이스와 스코프 Python Basic Series [Part6]: 코딩테스트를 위한 파이썬의 유용한 내장 모듈 collections

Table of Contents

  • Context Manager
  • with statement
  • open()
  • 참고

Context Manager

  • __enter__()와 __exit__() 메서드를 구현한 객체
    • __enter__(): 획득한 자원에 대한 디스크립터를 리턴하는 역할
    • __exit__(): 획득한 자원에 대한 락을 풀어주는 역할
    • 디스크립터(descriptor): 요청된 자원에 대해 접근하기 위해 필요한 OS에서 제공해주는 핸들
  • 자원 관리, 예외 처리와 같은 것들이 필요한 코드를 더 깔끔하고, 버그 발생 가능성을 줄이기 위해 사용
  • __enter__(), __exit__()를 정의만 하는 것은 반쪽짜리 결과. 이것들이 자동적으로 호출되어야 진정한 의미가 있음 -> with문
class MyContextManager:
    def __enter__(self):
        print("컨텍스트 매니저가 만들어졌습니다")
        self.x = "자원 관리를 필요로 하는 디스크립터"
        return self.x
    
    def __exit__(self, exc_type, ex_value, ex_traceback):
        print("컨텍스트 매니저를 삭제합니다")


cm = MyContextManager()

# 이것만으로는 아무런 의미가 없음
# with문으로 자동적으로 호출되도록 해야 의미가 있음

with statement

  • 컨텍스트 매니저의 __enter__()와 __exit__()를 자동으로 호출
  • 컨텍스트 매니저가 자신의 역할을 하기 위해 반드시 사용해야 하는 문
class MyContextManager:
    def __enter__(self):
        print("컨텍스트 매니저가 만들어졌습니다")
        self.x = "자원 관리를 필요로 하는 디스크립터"
        return self.x
    
    def __exit__(self, exc_type, ex_value, ex_traceback):
        print("컨텍스트 매니저를 삭제합니다")



with MyContextManager() as f:
    print(f)
--------------------------------------------------------------------
컨텍스트 매니저가 만들어졌습니다
자원 관리를 필요로 하는 디스크립터
컨텍스트 매니저를 삭제합니다

open()

  • open() 함수는 컨텍스트 매니저가 될 수 있는 파일 디스크립터를 리턴
  • 파일을 다 사용하고 난 후에는 반드시 닫아주는 것이 좋음
    • 이를 위해 직접 f.close() 하지말고 with문으로 알아서 열고 종료하도록 권장하기 위해 __enter__()와 __exit__()를 구현해놓음
with open('python_test/test.txt', 'w') as f:
    f.write('Hello world!')
# test.txt

Hello world!

참고

  • Jay’s Blog, Context manager
  • GeeksforGeeks, with statement in Python
Python Basic Series [Part7]: 파이썬의 네임스페이스와 스코프 Python Basic Series [Part6]: 코딩테스트를 위한 파이썬의 유용한 내장 모듈 collections

You may also like

See all python
01 May 2022 Python Advanced Series [Part5]: 파이썬으로 배우는 객체지향 프로그래밍 (2)
language
python

Python Advanced Series [Part5]: 파이썬으로 배우는 객체지향 프로그래밍 (2)

01 May 2022 Python Advanced Series [Part5]: 파이썬으로 배우는 객체지향 프로그래밍 (1)
language
python

Python Advanced Series [Part5]: 파이썬으로 배우는 객체지향 프로그래밍 (1)

17 Feb 2022 Python Advanced Series [Part5]: Code Documenting
language
python

Python Advanced Series [Part5]: Code Documenting

Jay Kim

Jay Kim

Web development, data engineering for human for the Earth. I share posts, free resources and inspiration.

Rest
Lifestyle
Hobby
Hobby
Hobby
Hobby
2025 © Jay's Cookbook. Crafted & Designed by Artem Sheludko.