728x90
728x90
파이썬 with문이란?
파이썬의 with문은 컨텍스트 관리자(context manager)를 사용하여 특정 작업의 시작과 종료를 자동으로 관리해주는 구문입니다. 주로 파일 작업이나 리소스 관리(예: 데이터베이스 연결, 네트워크 연결 등)에 사용되며, 블록이 종료되면 자동으로 정리 작업을 수행합니다. 이를 통해 코드의 가독성을 높이고, 리소스 누수를 방지할 수 있습니다.
기본 문법
with 컨텍스트_관리자 as 변수:
# 블록 내부에서 변수 사용
pass # 작업 수행
💡 동작 과정
- 컨텍스트 관리자: __enter__ 메서드가 호출되어 필요한 설정 작업을 수행.
- as 변수: __enter__의 반환값이 변수에 할당(선택 사항).
- 블록 실행: 블록 내부의 작업 수행.
- 블록 종료 후: __exit__ 메서드가 호출되어 정리 작업 수행(예: 파일 닫기).
파일 읽기, 쓰기 예제 코드
with문을 사용하면 파일을 열고 닫는 과정을 자동으로 처리할 수 있습니다.
💡 파일 읽기
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
print(content) # 파일 내용 출력
# 블록 종료 시 자동으로 파일 닫힘
💡 파일 쓰기
with open('example.txt', 'w', encoding='utf-8') as file:
file.write('Hello, World!')
# 블록 종료 시 파일이 자동으로 닫힘
with문의 장점
💡 자동 자원 관리
with문을 사용하면 명시적으로 파일을 닫는 작업이 필요 없습니다.
일반적인 파일 처리 방법 (반드시 닫아야 함):
file = open('example.txt', 'r', encoding='utf-8')
try:
content = file.read()
finally:
file.close() # 반드시 닫아야 함
with문 사용 (자동으로 닫힘):
with open('example.txt', 'r', encoding='utf-8') as file:
content = file.read()
# 자동으로 파일 닫힘
💡 에러 발생 시에도 안전
블록 내부에서 예외가 발생해도 __exit__ 메서드가 호출되므로 리소스가 안전하게 해제됩니다.
커스텀 컨텍스트 관리자 만들기
💡 사용자 정의 컨텍스트 관리자 만드는 방법
컨텍스트 관리자는 __enter__와 __exit__라는 두 가지 특별 메서드를 구현해야 합니다.
- __enter__ 메서드
- 블록 실행 전에 호출됩니다.
- 반환값은 as 뒤에 오는 변수에 할당됩니다.
- __exit__ 메서드
- 블록 실행이 끝난 후 호출됩니다.
- 예외가 발생해도 호출되며, 예외를 처리할 수 있습니다.
💡 간단한 예제 코드
class CustomContextManager:
def __enter__(self):
print("블록 시작!")
return "컨텍스트 반환값"
def __exit__(self, exc_type, exc_value, traceback):
print("블록 종료!")
if exc_type:
print(f"예외 발생: {exc_value}")
return True # 예외를 무시
# 사용
with CustomContextManager() as value:
print(f"값: {value}")
# 예외 발생 테스트
raise ValueError("예외 테스트")
print("정상적으로 종료")
'''
출력 결과
블록 시작!
값: 컨텍스트 반환값
블록 종료!
예외 발생: 예외 테스트
정상적으로 종료
'''
__exit__ 매개변수 설명
- exc_type: 예외 타입 (없으면 None).
- exc_value: 예외 객체.
- traceback: 예외 발생 시의 스택 정보.
with문의 다양한 활용
💡 파일 작업
with open('example.txt', 'r') as file:
data = file.read()
💡 데이터베이스 연결
import sqlite3
with sqlite3.connect('example.db') as conn:
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER, name TEXT)")
conn.commit()
💡 스레드 잠금
import threading
lock = threading.Lock()
with lock:
# 임계 영역
print("스레드 안전 작업 실행")
💡 HTTP 요청
import requests
with requests.get('https://example.com') as response:
print(response.text)
요약
- with문은 리소스를 자동으로 관리하고, 예외가 발생해도 안전하게 정리할 수 있도록 설계된 파이썬의 강력한 기능입니다.
- __enter__와 __exit__를 구현하여 사용자 정의 컨텍스트 관리자도 쉽게 만들 수 있습니다.
- 파일 작업, 네트워크 연결, 스레드 잠금 등 다양한 상황에서 활용할 수 있습니다.
반응형
728x90
'프로그래밍 > [Python] 파이썬' 카테고리의 다른 글
[python] 파이썬 아스키코드(ASCII) 변환 함수 (42) | 2025.01.09 |
---|---|
[Python] 파이썬 날짜, 시간 더하기 빼기 (79) | 2025.01.08 |
[Python] 파이썬 날짜/시간 포맷팅 다루기 (strftime, strptime) (61) | 2025.01.08 |
[Python] timedelta와 relativedelta의 시간 계산 차이점 (74) | 2025.01.07 |
Epoch time(에포크 시간)에 대하여 (133) | 2025.01.05 |