반응형
질문
나는 이것을 누군가의 코드에서 보았습니다. 이게 무슨 뜻인가요?
def __enter__(self):
return self
def __exit__(self, type, value, tb):
self.stream.close()
여기에 완전한 코드가 있습니다.
from __future__ import with_statement#for python2.5
class a(object):
def __enter__(self):
print 'sss'
return 'sss111'
def __exit__(self ,type, value, traceback):
print 'ok'
return False
with a() as s:
print s
print s
답변
이러한 마법 메서드(__enter__
, __exit__
)를 사용하면 with
문과 쉽게 사용할 수 있는 객체를 구현할 수 있습니다.
이 아이디어는 일종의 '클린다운' 코드가 실행되어야 하는 코드를 쉽게 작성할 수 있도록 해줍니다(마치 try-finally
블록처럼 생각해보세요). 여기에서 자세한 설명을 확인하세요.
유용한 예로는 데이터베이스 연결 객체가 있을 수 있습니다(그런 다음 해당 'with' 문이 범위를 벗어날 때 연결이 자동으로 닫힙니다):
class DatabaseConnection(object):
def __enter__(self):
# 데이터베이스 연결 생성 및 반환
...
return self.dbconn
def __exit__(self, exc_type, exc_val, exc_tb):
# dbconnection이 닫히도록 확인
self.dbconn.close()
...
위에서 설명한대로 with
문과 함께 이 객체를 사용하세요(Python 2.5에서 작업 중이라면 파일 맨 위에 from __future__ import with_statement
를 해야 할 수도 있습니다).
with DatabaseConnection() as mydbconn:
# 작업 수행
PEP343 -- 'with' 문도 좋은 설명이 있습니다.
반응형
댓글