Come fa chiudere i file Python che sono state gc'ed?
-
05-09-2019 - |
Domanda
Avevo sempre pensato che un file sarebbe la fuga se è stato aperto senza essere chiuso, ma ho appena verificato che se entro le seguenti righe di codice, il file si chiude:
>>> f = open('somefile.txt')
>>> del f
Proprio per pura curiosità, come funziona? Ho notato che il file non include un metodo __
del__
.
Soluzione
In CPython, almeno, i file sono chiusi quando l'oggetto file viene deallocato. Vedere la funzione file_dealloc
in Objects/fileobject.c
nella fonte CPython. Metodi dealloc sono specie-di come __del__
per i tipi C, tranne senza alcuni dei problemi inerenti __del__
.
Altri suggerimenti
Da qui la comunicato.
Per Python 2.5, l'uso
from __future__ import with_statement
(per Python 2.6 o 3.x, non fare nulla)
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 utilizza il conteggio di riferimento e distruzione deterministica oltre alla raccolta dei rifiuti. Quando non ci sono più riferimenti a un oggetto, l'oggetto viene rilasciato immediatamente. Rilascio di un file si chiude esso.
Questo è diverso esempio Java dove c'è solo la raccolta dei rifiuti non deterministico. Questo significa che connot sapere quando l'oggetto viene rilasciato, in modo da avere a chiudere il file manualmente.
Si noti che il conteggio di riferimento non è perfetto. Si possono avere oggetti con riferimenti circolari, che non è raggiungibile dal progamma. Ecco perché Python ha garbage collection in aggiunta al riferimento di conteggio.
ipotesi migliore è che, poiché il tipo di file è un tipo built-in, l'interprete si occupa di chiudere il file sul garbage collection.
In alternativa, si sta verificando solo dopo che l'interprete Python è uscito, e tutto "trapelare" handle di file sono chiusi in ogni modo.