But maybe if __exit__ is called with an exception it should roll back.

In any case it looks like your proposal could break existing code (e.g.
code that uses `with` depending on its current behavior, using some other
logic to decide whether to commit or not) and that feels difficult to
overcome. Perhaps a new method or flag argument can be added to request
that the transactions be automatically committed?

On Mon, Oct 30, 2017 at 10:20 AM, Drew <dwarwic...@gmail.com> wrote:

> IMAP4.close closes the selected inbox and commits changes such as
> deletions. It is not called on IMAP4.__exit__ (only logout is, which
> doesn't call close in its call stack) however, so:
>
> with imaplib.IMAP4_SSL(...) as i:
>     ...
>
> would fail to commit those changes. close must be explicitly invoked i.e.
>
> with imaplib.IMAP4_SSL(...) as i:
>     ...
>     i.close()
>
> This is counterintuitive however, as the with statement is meant to
> automatically clean up. Another programmer might come along and delete
> i.close() because it seems unnecessary. Now changes aren't being committed
> and the programmer doesn't realize it's because of this weird Python
> idiosyncracy.
>
> Python IO such as open commits changes automatically, so I'm not sure why
> IMAP4 doesn't and only logs out.
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas@python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
>


-- 
--Guido van Rossum (python.org/~guido)
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to