python - Closing a connection with a `with` statement -
i want have class represents imap connection , use with
statement follows:
class imapconnection: def __enter__(self): connection = imaplib.imap4_ssl(imap_host) try: connection.login(mail_username, mail_pass) except imaplib.imap4.error: log.error('failed log in') return connection def __exit__(self, type, value, traceback): self.close() imapconnection() c: rv, data = c.list() print(rv, data)
naturally fails since imapconnections
has no attribute close
. how can store connection , pass __exit__
function when with
statement finished?
you need store connection in object attributes. this:
class imapconnection: def __enter__(self): self.connection = imaplib.imap4_ssl(imap_host) try: self.connection.login(mail_username, mail_pass) except imaplib.imap4.error: log.error('failed log in') return self.connection def __exit__(self, type, value, traceback): self.connection.close()
you want implement list
method class.
edit: realized actual problem is. when with someclass(*args, **kwargs) c
c
not value returned __enter__
method. c
instance of someclass
. that's root of problem returned connection __enter__
, assumed c
said connection.
Comments
Post a Comment