python context manager
use contextlib/yield
@contextmanager
def send_mail_context():
'''context manager
with send_mail_context()
'''
try:
# 1 doing work BEFORE the code goes into with block
print('before yield')
server = smtplib.SMTP(SMTP_SERVERS[0], 25)
# 2 yield back to with/caller
yield server
except Exception as e:
print(e)
finally:
# 4. doing cleanup work
server.quit()
print('in finally')
use class __enter__
, __exit__
# 2 implement contextmanager with class
class SMTPCT(object):
'''
1. override __enter__ __exit__
2. in __enter__, return value
'''
def __init__(self):
self.smtp_server = None
def __enter__(self):
# 1 doing work BEFORE the code goes into with block
print('in enter')
self.smtp_server = smtplib.SMTP(SMTP_SERVERS[0], 25)
# 2 return back to with/caller
return self.smtp_server
def __exit__(self, type, value, traceback):
# 4. doing cleanup work
print('in exit')
self.smtp_server.quit()