with open() 처럼 내가 만든 클래스도 with로 쓰고 싶어서 컨텍스트 매니저라는 걸 직접 만들어봤습니다.
대충 이렇게 짰어요.
class Conn:
def __enter__(self):
print("연결")
return self
def __exit__(self, exc_type, exc_val, tb):
print("닫기")
with Conn() as c:
print("작업 중")
일단 돌려보니까 연결, 작업 중, 닫기 순서로 잘 찍히긴 해요. 근데 이해 안 되는 게 몇 개 있어요.
as c 에 들어가는 c가 __enter__에서 return한 self인 거 맞나요? 그리고 __exit__에 받는 저 exc_type, exc_val, tb 이 세 개는 대체 언제 값이 들어오는 거예요? 지금은 그냥 None만 찍히던데요.
또 궁금한 게, with 블록 안에서 에러가 나버리면 그래도 닫기가 실행되나요? 아니면 에러나면서 그냥 죽어버리나요? 그리고 __exit__에서 True를 리턴하면 어떻게 된다는 글을 봤는데 그건 또 무슨 소린지 모르겠습니다. 정리해주시면 감사하겠습니다.