New submission from guilimo:

Hello!


I experienced a strange behavior when using a generator, with some code 
encapsulated in a try/finally clause or a context manager.

If the generator is not exhausted when we leave the script (because normal end 
of script, uncatched exception, etc...), I expect an internal mechanism to 
execute properly the finally clause (or __exit__ if context manager).
However, in some specific cases, it seems that this mechanism does not work as 
expected.


Example
=======

Consider the following code:

import time

def create_generator():
    try:
        yield
    finally:
        time.sleep(2)

ct = create_generator()
ct.next()


If you try to execute it, you will get a:
"Exception AttributeError: "'NoneType' object has no attribute 'sleep'" in 
<generator object create_generator at 0x7f04ad62c0f0> ignored"



Description
===========

My understanding is the following (but I may be wrong):
At the end of the script, the garbage collector automatically calls the close() 
method of the generator. As a result, GeneratorExit is raised from the "yield", 
the finally clause is executed, but for some reason, time does not exist 
anymore (already collected by the GC?).
If you try just a print "xxx" instead of the time.sleep, it seems that there is 
not any problem.


Important note:
===============

An other very strange thing:
It seems that if I use an other name than "ct" for the generator, the same 
exact code runs flawlessly...

You can find attached 3 examples (with try/finally, with a context manager, and 
with an other name for the generator).

I also found this ticket where some discussion may be related to my situation, 
even if not describing exactly my current problem:
https://bugs.python.org/issue25014

----------
components: Interpreter Core
files: examples.zip
messages: 250460
nosy: guilimo
priority: normal
severity: normal
status: open
title: Clean issue when generator not exhausted (garbage collector related?)
type: crash
versions: Python 2.7
Added file: http://bugs.python.org/file40436/examples.zip

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue25069>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to