Hamp 2025. 2. 19. 22:56
반응형

👋 들어가기 전

현재 이미지 파일을 읽어 base 64로 변경하는 작업을 하고있는데

파이썬에서 특별한 keyword를 찾아 정리해본다.


with를 쓰지 않을 때 파일을 읽고 쓸때는 다음과 같이 작업을 해줘야했다.

f = open('example.txt', 'r')
sen = f.readline()
f.close()

 

열었으면 닫아야한다.

충분히 휴먼에러가 발생할 수 있는 부분이다.

 

또한 예외가 발생할경우 close 호출이 생략될 수도있다.


⛑  with 사용

사용 예시

1. 파일 열기 (open())

2. 데이터베이스 연결 (sqlite3.connect())

3. 멀티스레드 락 (threading.Lock())

4. 네트워크 연결 (socket)

 

with를 사용하면 작업이 끝나면 알아서 close를 호출해준다.

with open("test.png", "rb") as f:
    image = Image.open(f)  # 예외가 발생해도 자동으로 파일이 닫힘!

 

내부적으로 어떻게 동작할까??

ContextManager란

자원 설정에 중요한 역할을 하며, 연결을 열거나 자원이 이상
필요하지 않을 자동으로 정리하는 작업을 담당하는 객체를 의미한다.

 

특히 파이썬에서는 with 문과 함께 사용할 메서드를 정의하는 객체다.

 

with와 함께 쓰일려면 다음 메소드를 꼭 구현해줘야한다.

def __enter__(self): # 진입 시 호출됨


def __exit__(self, exc_type, exc_val, exc_tb): # 탈출 시 호출됨

# exc_type: 발생한 예외의 클래스 (Exception Type)
# exc_val: 발생한 예외의 인스턴스 (Exception Value)
# exc_tb: 예외가 발생한 트레이스백(traceback) 객체
# returnType: bool , True면 예외를 무시하고 계속실행, False면 예외 발생

 

한번 간단하게 만들어보자.

class ContextManager:
    def __enter__(self):
        print('enter...')
        return self # `as` 뒤에 오는 값이 됨

    def sayHello(self, name):
        print('context' + name)


    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit...')
        return False

with ContextManager() as c:
    c.sayHello("name")
    
    
'''
output:
enter...
contextname
exit...
'''
반응형