On Thu, May 28, 2015 at 10:16:00AM +0200, Peter Otten wrote: > Even if you limit yourself to CPython there is another effect: the order of > execution may not meet one's expectations/requirements:
[snip example] That's an interesting example, and I can't tell if that's a problem with your (and my) expectations, or a bug in the context manager implementation. PEP 343 clearly warns that the finally clause may not run immediately: Note that we're not guaranteeing that the finally-clause is executed immediately after the generator object becomes unused https://www.python.org/dev/peps/pep-0343/ but the documentation for the with-statement suggests strongly that the __exit__ method will run immediately after the block is exited, before any additional code (including before any exception is raised. E.g.: 5. The suite is executed. 6. The context manager’s __exit__() method is invoked. If an exception caused the suite to be exited, its type, value, and traceback are passed as arguments to __exit__(). Otherwise, three None arguments are supplied. https://docs.python.org/2/reference/compound_stmts.html#the-with-statement > PS: I'm still looking for a fairly elegant rewrite of the problematic > > def lines(files): > for file in files: > with open(files) as f: > yield from f > > (see Oscar's comment in > <https://mail.python.org/pipermail/tutor/2015-May/105448.html>) Oscar's comment includes a syntax error, which makes it hard to run his code: print("__exit__ called")__del__. I can't even begin to guess what that is supposed to be, and reading the next few messages in the thread doesn't enlighten. -- Steve _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor