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__.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top