STINNER Victor added the comment:

On Python 3.5 compiled in debug mode (or probably with python -Wd when compiled 
in release mode), I got this warning:

/home/haypo/prog/python/default/Lib/tempfile.py:708: ResourceWarning: 
Implicitly cleaning up <TemporaryDirectory '/tmp/tmpcr8u3m8v'>
  _warnings.warn(warn_message, ResourceWarning)

The script is really a corner case: the generator is garbage collected whereas 
it is not done. At the same time, the TemporaryDirectory object is also garbage 
collected. I guess that the exact order of object deletion is not reliable: the 
generator may be deleted before or after the TemporaryDirectory.

TemporaryDirectory._cleanup() is called by the finalizer (_weakref.finalize) of 
the TemporaryDirectory, which means that the TemporaryDirectory object is 
garbage collected.

TemporaryDirectory.cleanup() is called indirectly by 
TemporaryDirectory.__exit__().

I'm suprised that deleting a generator calls __exit__().

The following script has a more reliable behaviour: 
TemporaryDirectory.__exit__() is called when the generator is deleted, and 
TemporaryDirectory.cleanup() is not called.
---
import tempfile
import gc

def generator():
    with tempfile.TemporaryDirectory():
        print("before yield")
        yield
        print("after yield")
g = generator()
next(g)

g = None
gc.collect()
---

----------

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

Reply via email to