On Mon, Jul 29, 2002 at 01:34:01PM -0400, Guido van Rossum wrote: > > http://www.python.org/sf/584626 > > > > This patch removes the limitation of not allowing yield in the try part > > of a try/finally. The dealloc function of a generator checks if the > > generator is still alive and resumes it one last time from the return > > instruction at the end of the code, causing any try/finally blocks to be > > triggered. Any exceptions raised are treated just like exceptions in a > > __del__ finalizer (printed and ignored). > > I'm not sure I understand what it does. The return instruction at the > end of the code, if I take this literally, isn't enclosed in any > try/finally blocks. So how can this have the desired effect? They're on the block stack. The stack unwind does the rest. > Have you verified that Jython can implement these semantics too? I don't see why not. The trick of jumping to the end was just my way to avoid adding a flag or some magic value to signal to eval_frame that it needs to trigger the block stack unwind on ceval.c:2201. There must be many other ways to implement this. > Do you *really* need this? I'm a plumber. I make pipelines by chaining iterators and transformations. My favorite fittings are generator functions and closures so I rarely need to actually define a class. One of my generator functions needed to clean up some stuff so I naturally used a try/finally block. When the compiler complained I recalled that when I first read with excitement about generator functions there was a comment there about some arbitrary limitation of yield statements in try/finally blocks... Anyway, I ended up creating a temporary local object just so I could take advantage of its __del__ method for cleanup but I really didn't like it. After a quick look at ceval.c I realized that it would be easy to fix this by having the dealloc function simulate a return statement just after the yield that was never resumed. So I wrote a little patch to remove something that I consider a wart. Oren Teaser: coming soon on the dataflow library! transparent two-way interoperability between iterators and unix pipes!
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