[Python-Dev] On Syntax Extensibility (again)

Samuele Pedroni pedronis@bluewin.ch
Mon, 09 Jun 2003 21:30:07 +0200


still thinking about this stuff.

At 01:19 07.06.2003 +0200, Samuele Pedroni wrote:
>I thought python-dev archives would be a better place for this than my hd. 
>Warning: terse.
>
>I have come to the conclusion that I should agree with Guido:
>
>- generators do not let really abstract over things like exception 
>handling etc.

what I had in mind were generators like this one:

def all_lines(file_list_filename):
   for fn in open(file_list_filename,'r'):
     fn = fn.rstrip()
     for line in open(fn,'r'):
       yield line

for line in all_lines("all_files"):
   <do-stuff>

what if we want to release resources (here in this toy example namely close 
files) in a timely fashion in face of exception also in <do-stuff>.

all of these touch on the issue:
- non-support of 'yield' inside try-finally
- PEP 288: Generators Attributes and Exceptions
- PEP 310: Reliable Acquisition/Release Pairs
- proposals for syntax extensibility through Ruby/Smalltalk-like 
first-class blocks

so all these proposals should be considered together and in an organic way.

With current Python a possible rewrite of the above would be:

class all_lines(object):
   def __init__(self,file_list_fname):
     self.listf = open(file_list_fname,'r')
     self.f = None
   def __iter__(self):
     for fn in self.listf:
       fn = fn.rstrip()
       self.f = open(fn,'r')
       for line in self.f:
         yield line
       self.f.close()
       self.f = None
   def close(self):
     self.listf.close()
     if self.f: self.f.close()

x = all_lines("all_files")
try:
   for line in x:
     <do-stuff>
finally:
   x.close()

kind of obfuscated.

maybe-generators-should-grow-a-close-method-ly y'rs - Samuele