[Python-Dev] PEP 340 - possible new name for block-statement

Phillip J. Eby pje at telecommunity.com
Sat Apr 30 03:52:07 CEST 2005


At 04:02 PM 4/29/05 -0700, Guido van Rossum wrote:
>Actually, I think this is a nice way to have my cake and eat it too:
>on the one hand, there still isn't any user-defined syntax, because
>the keyword-less block syntax is still fixed by the compiler. On the
>other hand, people are free to *think* of it as introducing syntax if
>it helps them understand the code better. Just as you can think of
>each distinct @decorator as a separate piece of syntax that modifies a
>function/method definition. And just as you can think of a function
>call as a user-defined language extension.

And, amusingly enough, those folks who wanted a decorator suite can now 
have their wish, e.g.:

     decorate(classmethod):
         def something(cls, blah):
             ...

Given a suitable frame-sniffing implementation of 'decorate'.  :)

By the way, I notice PEP 340 has two outstanding items with my name on 
them; let me see if I can help eliminate one real quick.

Tracebacks: it occurs to me that I may have unintentionally given the 
impression that I need to pass in an arbitrary traceback, when in fact I 
only need to pass in the current sys.exc_info().  So, if the error call-in 
doesn't pass in anything but an error flag, and the template iterator is 
supposed to just read sys.exc_info(), maybe that would be less of an 
issue?  For one thing, it would make handling arbitrary errors in the 
template block cleaner, because the traceback for unhandled errors in 
something like this:

     synchronized(foo):
         raise Bar

would look something like this:

     File .... line ... of __main__:
         synchronized(foo):
     File .... line ... of synchronized:
         yield
     File .... line ... of __main__:
         raise Bar

Which, IMO, is the "correct" traceback for this circumstance, although 
since the first and last frame would actually be the same, you'd probably 
only get the lower two entries (the yield and the raise), which is OK too I 
think.

Anyway, I mainly just wanted to note that I'd be fine with having a way to 
say, "Hey, there's an error, handle it" that doesn't allow passing in the 
exception or traceback, but is just a flag that means "look at Python's 
error state" instead of passing a value back in.

I can do this because when I need to pass in a traceback, it's because I'm 
trying to pass a terminated coroutine's error into another coroutine.  So, 
the traceback I want to pass in is Python's existing "last error" state anyway.



More information about the Python-Dev mailing list