Per aggiungere al James Mills' answer, se avete bisogno di capire il motivo specifico non vedi eventuali errori:
Python definisce che, quando un file viene garbage collection, verrà chiusa automaticamente. Ma Python lascia all'implementazione come vuole gestire la garbage collection. CPython, l'implementazione che stai probabilmente usando, lo fa con il conteggio dei riferimenti: non appena l'ultimo riferimento ad un oggetto scompare, viene immediatamente raccolto. Quindi, tutti questi apparirà a lavorare in CPython:
def spam():
for i in range(100000):
open('spam.txt') # collected at end of statement
def eggs():
for i in range(100000):
f = open('eggs.txt') # collected next loop, when f is reassigned
def beans():
def toast():
f = open('toast.txt') # collected when toast exits
for i in range(100000):
toast()
Ma molte altre implementazioni (tra cui l'altro tre grandi, PyPy, Jython e IronPython) utilizzare netturbini più intelligenti che rilevano spazzatura al volo , senza dover tenere traccia di tutti i riferimenti. Ciò li rende più efficienti, migliori nel threading, ecc., Ma significa che non è deterministico quando un oggetto viene raccolto. Quindi lo stesso codice non funzionerà. Oppure, peggio, funzionerà nei tuoi 60 test, e poi fallirà non appena stai facendo una demo per i tuoi investitori.
Sarebbe un peccato se avessi bisogno della velocità di PyPy o dell'integrazione .NET di IronPython, ma non potevi averlo senza riscrivere tutto il tuo codice. O se qualcun altro voleva usare il tuo codice, ma aveva bisogno che funzionasse in Jython, e doveva cercare altrove.
Nel frattempo, anche in CPython, l'interprete non raccoglie tutti i suoi rifiuti in caso di arresto. (Sta migliorando, ma anche nel 3.4 non è perfetto.Quindi, in alcuni casi, stai facendo affidamento sul sistema operativo per chiudere i tuoi file per te. Il sistema operativo sarà di solito svuotalo quando lo fa, ma forse non se tu, ad es., Li avessi aperti in un thread daemon, o sei uscito con os._exit
o segfault. (E, naturalmente, sicuramente non se si è usciti da qualcuno inciampare il cavo di alimentazione.)
Infine, anche CPython (dal 3,3, credo) ha un codice specifico per generare avvisi se si lascia che i tuoi file siano garbage collection invece di chiuderli. Questi avvisi sono disattivati per impostazione predefinita, ma le persone propongono regolarmente di accenderli e un giorno potrebbe accadere.
Quando ci pensi equivale a "Se dimentico di segnalare quando guido non ho * ancora * avuto un incidente, quindi dovrei smettere di usare i miei indicatori?" - solo perché tu di solito *** fai sesso con qualcosa non lo rende una buona idea. –