Martin Panter added the comment:

In the long term, I prefer not calling close() in __del__(), like 
del-flush.patch, although I admit it is an API change and should probably be 
limited to 3.6+. If people want to improve things in 3.5, privately 
implementing _dealloc_warn() like Victor’s pyio_res_warn-3.patch seems the best 
option.

Serhiy: why did you add 2.7 to this bug? For 2.7, I don’t think anything should 
be done. There is no ResourceWarning in 2.7.

In 3.5, _dealloc_warn() could also be implemented in SocketIO (possibly also 
HTTPResponse, GzipFile, etc). But it should not become a public API, and I 
don’t think it is important to make this sort of change to 3.5 anyway.

In 3.6, if we stopped __del__() from calling close() like del-flush.patch, we 
would be changing the documented behaviour: 
<https://docs.python.org/3.6/library/io.html#io.IOBase.__del__> says “IOBase . 
. . calls the instance’s close() method.” But the end result seems cleaner to 
me. I think changing or adding an API (__del__, _dealloc_warn, etc) is 
necessary for a general solution to the problem.

The effect of del-flush.patch will be that a wrapped FileIO or similar object 
will not be closed until all references are deleted.

>>> file = open(os.devnull, "wb", 0)
>>> print(file)
<_io.FileIO name='/dev/null' mode='wb' closefd=True>
>>> wrapper = BufferedWriter(file)

In 3.5, deleting the wrapper produces a warning and closes the underlying file:

>>> del wrapper
__main__:1: ResourceWarning: unclosed file <_io.BufferedWriter name='/dev/null'>
>>> print(file)
<_io.FileIO [closed]>
>>> file.write(b"more data")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: I/O operation on closed file

I propose that in 3.6, deleting a wrapper should not automatically close or 
warn about the wrapped object until all references are deleted:

>>> del wrapper  # No problem; we still have a reference to "file"
>>> file.write(b"more data")  # File is still open
9
>>> del file  # Finally closes the file and triggers the warning
ResourceWarning: unclosed file <FileIO>

----------

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

Reply via email to