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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top