2012-07-10 14 views
8

Diciamo che avete:Vale la pena chiudere i file in piccole funzioni?

def my_func(): 
    fh = open(...) 
    try: 
     print fh.read() 
    finally: 
     fh.close() 

La mia prima domanda è: è la pena di avere la dichiarazione try/finally (o con)? Il file non si chiude comunque quando termina la funzione (tramite garbage collection)?

Ho trovato questo dopo aver letto la ricetta modulo "python libro di cucina" di Martelli, dove

all_the_text = open('thefile.txt').read() 

arriva con il commento: "Quando si esegue questa operazione, non si ha più un riferimento all'oggetto di file non appena l'operazione di lettura termina, in pratica, Python nota la mancanza di un riferimento in una volta e chiude immediatamente il file ".

Il mio esempio di funzione è quasi lo stesso. Hai un riferimento, è solo che il riferimento ha una vita molto breve.

La mia seconda domanda è: cosa significa "immediatamente" nella dichiarazione di Martelli? Anche se non si ha alcun riferimento, la chiusura dei file non avviene comunque al momento della raccolta dei rifiuti?

+0

Non direi che il tuo esempio è del tutto simile. Assegnate il file alla variabile 'fh' mentre' open ('thefile.txt'). Read() 'usa semplicemente' read' subito dopo il riferimento quando viene creato senza salvarlo. Penso che sia quello che intende per * immediatamente * – jamylak

+0

possibile duplicato di [domanda descrittore python close file] (http://stackoverflow.com/questions/4599980/python-close-file-descriptor-question) – jamylak

risposta

12

È buona pratica chiudere il file da soli. L'uso dell'istruzione with porta a pulire il codice e chiude automaticamente il file (che è una buona cosa).

Anche se Python è un linguaggio di programmazione di alto livello, è comunque necessario avere il controllo di ciò che si sta facendo. Come regola generale: se apri un file, deve anche essere chiuso. Non c'è mai una buona ragione per essere sciatti nel tuo codice :-)

Per quanto riguarda la tua seconda domanda: non verrà eseguita immediatamente, verrà eseguita quando il garbage collector decide che è ora di eseguire. Quando l'oggetto file è deallocato, Python chiuderà il file. Qui ci sono somearticles su garbage collection in Python (vedi anche il modulo gc), è una lettura interessante.

Mostra anche che la garbage collection di Python utilizza una soglia basata sul numero di oggetti allocati e deallocati prima che decida di eseguire il garbage collector. Se il tuo file è grande allora Python potrebbe tenere il file aperto più a lungo del necessario perché il codice della raccolta dei dati inutili potrebbe non essere ancora stato eseguito.

+2

Abbastanza corretto. La cosa più intrigante per me è cosa succede sotto il cofano e cosa succede quando il conto scende a 0. Vedi la mia modifica (contenente la seconda domanda riguardante l'affermazione "immediatamente" di Martelli). –

+2

Probabilmente dovresti notare che CPython usa una combinazione di conteggio dei riferimenti e raccolta dei dati inutili, quindi in casi semplici, la spazzatura viene raccolta immediatamente dopo la distruzione dell'ultimo riferimento. –