[Python-Dev] capturing RETURN_VALUE (original) (raw)

Christian Tismer tismer at stackless.com
Sun Aug 8 19:04:35 CEST 2004


Dear list,

just by chance, I discovered a probably very unknown feature of the block stack machinery of Python's frames:

-- It is possible to abandon a return statement. --

My question: Is this an artifact, or can I rely on this feature to persist for a while (while while >= 1 year) ?

Example code: I have a code body which either computes and returns a value, or it raises an exception. Surrounding it, I have a while true loop, embracing a try..finally block. In case of an exception, it simply lets the exception pass. In case of a return value, it intercepts it and can do anything (in the example, it just decorates the value and returns).

def return_capture(n, do_raise=False): _have_value = False # outer while loop, just there to get cancelled while True: try: # function body, returning a value or raising if do_raise: raise ValueError, "was told to raise" # signal valid value _have_value = True retval = n*n return finally: if _have_value: break # here we end after a captured return, and can do postprocessing retval = ("here the captured return value", retval) return retval

Sample output:

return_capture(5) ('here the captured return value', 25) return_capture(5, True) Traceback (most recent call last): File "", line 1, in ? File "", line 8, in return_capture ValueError: was told to raise

Again the question: Artifact, or a reliable feature?

ciao - chris

-- Christian Tismer :^) <mailto:tismer at stackless.com> Mission Impossible 5oftware : Have a break! Take a ride on Python's Johannes-Niemeyer-Weg 9a : Starship http://starship.python.net/ 14109 Berlin : PGP key -> http://wwwkeys.pgp.net/ work +49 30 89 09 53 34 home +49 30 802 86 56 mobile +49 173 24 18 776 PGP 0x57F3BF04 9064 F4E1 D754 C2FF 1619 305B C09C 5A3B 57F3 BF04 whom do you want to sponsor today? http://www.stackless.com/



More information about the Python-Dev mailing list