파이썬 고급 문법: 컨텍스트 매니저
컨텍스트 매니저의 개념, `with` 문 사용법, 그리고 사용자 정의 컨텍스트 매니저
컨텍스트 매니저(Context Manager)는 코드 블록의 진입과 종료를 자동으로 관리해 주는 파이썬의 강력한 기능입니다. 파일 열기, 데이터베이스 연결, 리소스 관리 등에서 사용됩니다. 이번 글에서는 컨텍스트 매니저의 개념, with
문 사용법, 그리고 사용자 정의 컨텍스트 매니저를 살펴보겠습니다.
1. 컨텍스트 매니저란?
- 컨텍스트 매니저는 코드 블록 전후로 필요한 설정과 정리 작업을 자동으로 처리합니다.
- 일반적으로
with
문과 함께 사용됩니다. - 주요 사례:
- 파일 열기 및 닫기
- 데이터베이스 연결 관리
- 리소스 정리 (예: 락 해제, 네트워크 연결 종료)
2. with
문을 활용한 기본 컨텍스트 매니저
파이썬에서 자주 사용하는 with
문을 통해 컨텍스트 매니저를 간단히 활용할 수 있습니다.
예제: 파일 처리
1
2
3
4
with open("example.txt", "w") as file:
file.write("Hello, Context Manager!")
# 파일은 블록 종료 시 자동으로 닫힙니다.
open()
함수는 컨텍스트 매니저를 지원하므로,with
문을 사용하면 파일 닫기를 자동으로 처리합니다.- 명시적으로
file.close()
를 호출하지 않아도 됩니다.
3. 컨텍스트 매니저의 구현
컨텍스트 매니저는 클래스나 데코레이터로 구현할 수 있습니다.
1) 클래스 기반 컨텍스트 매니저
컨텍스트 매니저 클래스를 구현하려면 __enter__
와 __exit__
메서드를 정의해야 합니다.
기본 구조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyContext:
def __enter__(self):
print("Entering the context.")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Exiting the context.")
# 사용 예제
with MyContext() as context:
print("Inside the context.")
# 출력:
# Entering the context.
# Inside the context.
# Exiting the context.
__enter__
: 코드 블록에 진입할 때 실행.__exit__
: 코드 블록을 벗어날 때 실행.- 예외가 발생하면
exc_type
,exc_value
,traceback
에 관련 정보가 전달됩니다.
- 예외가 발생하면
2) 데코레이터 기반 컨텍스트 매니저
contextlib
모듈의 @contextmanager
데코레이터를 사용하여 컨텍스트 매니저를 간단히 구현할 수 있습니다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from contextlib import contextmanager
@contextmanager
def my_context():
print("Entering the context.")
yield
print("Exiting the context.")
# 사용 예제
with my_context():
print("Inside the context.")
# 출력:
# Entering the context.
# Inside the context.
# Exiting the context.
yield
키워드를 사용하여 컨텍스트 블록 내에서 실행될 코드를 지정합니다.yield
전후로 진입 및 종료 시 실행할 작업을 정의합니다.
4. 컨텍스트 매니저 활용 사례
1) 파일 처리
1
2
3
4
with open("example.txt", "r") as file:
content = file.read()
print(content)
# 파일은 자동으로 닫힘.
2) 데이터베이스 연결
1
2
3
4
5
6
7
8
import sqlite3
with sqlite3.connect("example.db") as conn:
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER, name TEXT)")
cursor.execute("INSERT INTO users VALUES (1, 'Alice')")
conn.commit()
# 연결이 자동으로 종료됨.
3) 리소스 관리
1
2
3
4
5
6
7
from threading import Lock
lock = Lock()
with lock:
print("Critical section is locked.")
# 락이 자동으로 해제됨.
4) 사용자 정의 컨텍스트 매니저
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class ResourceManager:
def __enter__(self):
print("Resource acquired.")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Resource released.")
with ResourceManager() as resource:
print("Using the resource.")
# 출력:
# Resource acquired.
# Using the resource.
# Resource released.
5. 컨텍스트 매니저와 예외 처리
컨텍스트 매니저는 예외가 발생해도 종료 작업을 안전하게 수행합니다.
예제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class SafeManager:
def __enter__(self):
print("Entering safely.")
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
print(f"An exception occurred: {exc_value}")
print("Exiting safely.")
with SafeManager():
print("Inside safe block.")
raise ValueError("Something went wrong.")
# 출력:
# Entering safely.
# Inside safe block.
# An exception occurred: Something went wrong.
# Exiting safely.
정리
- 컨텍스트 매니저는 리소스 정리와 코드 블록 관리를 자동화하는 파이썬의 강력한 기능입니다.
with
문과 함께 사용하여 코드의 가독성과 안정성을 높일 수 있습니다.__enter__
와__exit__
메서드를 사용하거나,@contextmanager
데코레이터를 활용하여 직접 컨텍스트 매니저를 구현할 수 있습니다.
다음 글 예고:
이제 파이썬 심화 학습의 마지막 주제로, “파이썬에서의 병렬 처리와 비동기 프로그래밍”을 배워보겠습니다!
This post is licensed under CC BY 4.0 by the author.