I had always assumed that a file would leak if it was opened without being closed, but I just verified that if I enter the following lines of code, the file will close:
>>> f = open('somefile.txt')
>>> del f
Just out of sheer curiosity, how does this work? I notice that file doesn't include a __
del__
method.
Python uses reference counting and deterministic destruction in addition to garbage collection. When there is no more references to an object, the object is released immediately. Releasing a file closes it.
This is different than e.g. Java where there is only nondeterministic garbage collection. This means you connot know when the object is released, so you will have to close the file manually.
Note that reference counting is not perfect. You can have objects with circular references, which is not reachable from the progam. Thats why Python has garbage collection in addition to reference counting.
Best guess is that because the file type is a built-in type, the interpreter itself handles closing the file on garbage collection.
Alternatively, you are only checking after the python interpreter has exited, and all "leaked" file handles are closed anyways.
In CPython, at least, files are closed when the file object is deallocated. See the
file_dealloc
function inObjects/fileobject.c
in the CPython source. Dealloc methods are sort-of like__del__
for C types, except without some of the problems inherent to__del__
.Hence the with statement.
For Python 2.5, use
(For Python 2.6 or 3.x, do nothing)