[Python-Dev] Possible context managers in stdlib

Terry Reedy tjreedy at udel.edu
Tue Jul 12 21:38:44 CEST 2005


"Nick Coghlan" <ncoghlan at gmail.com> wrote in message 
news:42D3A766.90705 at gmail.com...
> The main outcome of the PEP 343 terminology discussion was some proposed
> documentation I put on the Sourceforge patch tracker ([1]).

Is this a proposal for the Language Reference manual?

> [1] http://www.python.org/sf/1234057
> ==========================================
> With Statements and Context Management
>
> A frequent need in programming ...
>
> A simpler way to achieve this in Python is to use the 'with' statement
> along with the appropriate context manager.

Somewhere about here we need the syntax itself.

> Context managers define an...
>      the contained suite starts. If the 'as' clause of the 'with'

Else this does not mean much.
...
> The simplest use of context management is to strictly control the
> handling of key resources (such as files, generators, database
> connections, synchronisation locks).

I have a little trouble seeing generators (as opposed to iterables) as 
resources needing management.

> For example, the following context manager allows prompt closure of
> any resource with a 'close' method (e.g. a generator or file):

And I was not aware that they had close methods.  You mean a iterable (not 
just a file) with both an associated generator and a close?  Or are 
generators gaining close methods (which make no sense to me).  Or are you 
using 'generator' in a different sense?

>      class closing(object):
>          def __init__(self, resource):
>              self.resource = resource
>
>          def __enter__(self):
>              return self.resource
>
>          def __exit__(self, *exc_info):
>              self.resource.close()
>
>
>     with closing(my_generator()) as g:
>         # my_generator() is assigned to g via call to __enter__()
>         for item in g:
>             print item
>     # g is closed as the with statement ends

To me, this should be with closing(my_iterable())... with 'for' calling 
g.__iter__ to get the iterator that is possibly a generator.  Otherwise, I 
don't understand it.

The rest is pretty clear.

Terry J. Reedy





More information about the Python-Dev mailing list