A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://mail.python.org/pipermail/python-dev/2005-April/052850.html below:

[Python-Dev] anonymous blocks

[Python-Dev] anonymous blocksNick Coghlan ncoghlan at gmail.com
Fri Apr 22 18:41:58 CEST 2005
Skip Montanaro wrote:
>     Guido> or perhaps even (making "for VAR" optional in the for-loop syntax)
>     Guido> with
> 
>     Guido>     in synchronized(the_lock):
>     Guido>         BODY
> 
> This could be a new statement, so the problematic issue of implicit
> try/finally in every for statement wouldn't be necessary.  That complication
> would only be needed for the above form.

s/in/with/ to get PEP 310.

A parallel which has been bugging me is the existence of the iterator protocol 
(__iter__, next()) which you can implement manually if you want, and the 
existence of generators, which provide a nice clean way of writing iterators as 
functions.

I'm wondering if something similar can't be found for the __enter__/__exit__ 
resource protocol.

Guido's recent screed crystallised the idea of writing resources as two-part 
generators:

def my_resource():
   print "Hi!"   # Do entrance code
   yield None    # Go on with the contents of the 'with' block
   print "Bye!"  # Do exit code

Giving the internal generator object an enter method that calls self.next() 
(expecting None to be returned), and an exit method that does the same (but 
expects StopIteration to be raised) should suffice to make this possible with a 
PEP 310 style syntax.

Interestingly, with this approach, "for dummy in my_resource()" would still wrap 
the block of code in the entrance/exit code (because my_resource *is* a 
generator), but it wouldn't get the try/finally semantics.

An alternative would be to replace the 'yield None' with a 'break' or 
'continue', and create an object which supports the resource protocol and NOT 
the iterator protocol. Something like:

def my_resource():
   print "Hi!"   # Do entrance code
   continue      # Go on with the contents of the 'with' block
   print "Bye!"  # Do exit code

(This is currently a SyntaxError, so it isn't ambiguous in any way)

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
---------------------------------------------------------------
             http://boredomandlaziness.skystorm.net
More information about the Python-Dev mailing list

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4