On Mon, Nov 5, 2012 at 12:32 AM, Barry Warsaw
On Nov 02, 2012, at 08:41 AM, Nick Coghlan wrote:
Go's "defer" is quite a neat solution for these hassles if anyone's in the mood for a time machine discussion.
Go was one of the reference points for the ExitStack design (it's a large part of why the API also supports providing callbacks directly to the exit stack, not just as context managers).
Is it fair to say that the difference between Go's defer and ExitStack is that the latter gives you the opportunity to clean up earlier than at function exit?
Yep. You can also do some pretty interesting things with ExitStack because of the pop_all() operation (which moves all of the registered operations to a *new* ExitStack instance). I wrote up a few of the motivating use cases as examples and recipes in the 3.3 docs: http://docs.python.org/3/library/contextlib#examples-and-recipes I hope to see more interesting uses over time as more people explore the possibilities of a dynamic tool for composing context managers without needing to worry about the messy details of unwinding them correctly (ExitStack.__exit__ is by far the most complicated aspect of the implementation). Cheers, Nick. -- Nick Coghlan | ncoghlan@gmail.com | Brisbane, Australia