Message262470
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> |
|
Date |
User |
Action |
Args |
2016-03-25 23:54:06 | martin.panter | set | recipients:
+ martin.panter, pitrou, vstinner, Arfrever, akira, piotr.dobrogost, serhiy.storchaka |
2016-03-25 23:54:06 | martin.panter | set | messageid: <1458950046.18.0.97162525563.issue19829@psf.upfronthosting.co.za> |
2016-03-25 23:54:06 | martin.panter | link | issue19829 messages |
2016-03-25 23:54:05 | martin.panter | create | |
|