Comment ne python fichiers étroits qui ont été gc'ed?
-
05-09-2019 - |
Question
Je l'avais toujours pensé qu'un fichier fuirait si elle a été ouvert sans être fermé, mais je vérifié que si j'entre les lignes de code ci-dessous, le fichier fermer:
>>> f = open('somefile.txt')
>>> del f
Juste par pure curiosité, comment cela fonctionne? Je remarque que le fichier ne comprend pas une méthode de __
del__
.
La solution
En CPython, au moins, les fichiers sont fermés lorsque l'objet fichier est désalloué. Voir la fonction file_dealloc
en Objects/fileobject.c
dans la source CPython. méthodes de tri sont dealloc de comme __del__
pour les types C, à l'exception sans certains des problèmes inhérents à __del__
.
Autres conseils
D'où la déclaration.
Pour Python 2.5, utilisez
from __future__ import with_statement
(pour Python 2.6 ou 3.x, rien faire)
with open( "someFile", "rU" ) as aFile:
# process the file
pass
# At this point, the file was closed by the with statement.
# Bonus, it's also out of scope of the with statement,
# and eligible for GC.
Python utilise le comptage de référence et la destruction déterministe, en plus de la collecte des ordures. Quand il n'y a plus aucune référence à un objet, l'objet est immédiatement libéré. Annulation d'un fichier ferme.
Ceci est différent de celui par exemple Java où il n'y a que la collecte des ordures non déterministes. Cela signifie que vous savez connot lorsque l'objet est libéré, de sorte que vous devrez fermer le fichier manuellement.
Notez que le comptage de référence est pas parfait. Vous pouvez avoir des objets avec des références circulaires, qui n'est pas accessible depuis le progamme. Cest pourquoi Python a la collecte des ordures, en plus de comptage de référence.
Best conjecture est que parce que le type de fichier est un fichier l'interpréteur gère lui-même le type, en construit la fermeture de la collecte des ordures.
Sinon, vous ne vérifiez après l'interpréteur python est sorti, et tout « fuite » poignées de fichiers sont fermés de toute façon.