[Python-Dev] PEP 343 - Abstract Block Redux

Phillip J. Eby pje at telecommunity.com
Sat May 14 19:01:01 CEST 2005


At 01:55 PM 5/14/2005 +0200, Fredrik Lundh wrote:
>also, come to think of it, adding a new statement just to hide
>try/finally statements is a waste of statement space.  why not
>just enhance the existing try statement?  let
>
>     try with opening(file) as f:
>         body
>     except IOError:
>         deal with the error (you have to do this anyway)
>
>behave like
>
>     try:
>         f = opening(file)
>         try:
>             try:
>                 body
>             except:
>                 exc = sys.exc_info()
>             else:
>                 exc = None
>         finally:
>             f.__cleanup__(exc)
>     except IOError:
>         deal with the error
>
>and you're done.  (or you could use __enter__ and __exit__ instead,
>which would give you a variation of PEP-343-as-I-understand-it)

I like this, if you take out the "with" part, change the method names to 
__try__ and __finally__, and allow "try" to work as a block on its own if 
you've specified an expression.  i.e.:

     try opening(filename) as f:
         # do stuff

     try locking(self.__lock):
         # do stuff

     try redirecting_stdout(f):
         # something

     try decimal.Context(precision=23):
         # okay, this one's a little weird

     try self.__lock:
         # and so's this; nouns read better with a gerund wrapper

and I'd make the translation be:

     try:
         __exc = ()
         VAR = EXPR.__try__()
         try:
             try:
                 BODY
             except:
                 __exc = sys.exc_info()
                 raise
         finally:
             EXPR.__finally__()

     # except/else/finally clauses here, if there were any in the original try


>but I still think that something closer to the original PEP 340 is a lot
>more useful.

I agree, but mainly because I'd like to be able to allow try/finally around 
"yield" in generators, be able to pass exceptions into generators, and tell 
generators to release their resources.  :)

I do think that the PEP 340 template concept is much more elegant than the 
various PEP 310-derived approaches, though.



More information about the Python-Dev mailing list