E 'una pratica povero. Non ha nulla a che fare con la modalità aperta (leggi, scrivi, leggi + scrivi, aggiungi, modalità binaria, modalità testo ...).
In CPython, "funziona quasi sempre" perché gli oggetti di file vengono chiusi automaticamente quando diventano rifiuti (irraggiungibile), e il riferimento di CPython contando solito raccoglie (non ciclico) di immondizia molto presto dopo che diventa spazzatura.
Ma fare affidamento su questo è davvero una cattiva pratica.
Se, ad esempio, dosomething(f)
viene eseguito per un'ora prima che ritorni, è probabile che l'oggetto file rimanga aperto per tutto il tempo.
Nota: in alcuni casi, è possibile codificare dosomething(f)
per chiudere esplicitamente l'oggetto del file passato. In questi casi, non è pratica poveri ;-)
tardi: una cosa correlata ho spesso visto è questo:
data = open(file_path).read()
Nel CPython, l'oggetto file senza nome è garbage collection (e quindi anche chiuso) immediatamente dopo il completamento dell'istruzione, grazie al conteggio dei riferimenti di CPython. Le persone sono poi sorprese quando spostano il loro codice su una diversa implementazione Python, e ottengono "troppi file aperti!" denunce, contestazioni.Eh - serve 'em destra ;-)
Esempio:
open("Output.txt", "w").write("Welcome")
print open("Output.txt").read()
Questo stampa
Welcome
in CPython, perché l'oggetto di file senza nome dalla prima affermazione è garbage collection (e chiuso) immediatamente quando termina la prima dichiarazione.
Ma:
output = open("Output.txt", "w")
output.write("Welcome")
print open("Output.txt").read()
stamperà probabilmente una riga vuota CPython. In questo caso, l'oggetto file è associato a un nome (output
), quindi è non garbage collector quando viene completata la seconda istruzione (un'implementazione più intelligente potrebbe teoricamente rilevare che output
non viene mai più utilizzato, e garbage-collect subito, ma CPython no).
"Welcome" è probabilmente ancora nel buffer di memoria del file, quindi non è stato ancora scritto sul disco. Quindi la terza affermazione probabilmente trova un file vuoto e non stampa nulla.
In altre implementazioni di Python, entrambi gli esempi possono stampare linee vuote.
Ottima risposta. Ho incluso un esempio. Si prega di controllare quello – thefourtheye
Grazie! Risulta che ci sono molte sottigliezze, quindi ho aggiunto molte spiegazioni ;-) –