Nel seguente codice mi aspetto che python stia liberando fileinput.input
quando sono al numero return
nel mezzo del mio ciclo perché sta andando fuori campo. Tuttavia, quando si chiama di nuovo la mia funzione fileinput mi dicePerché l'oggetto fileinput.input non viene perso quando si esce dall'ambito di applicazione?
raise RuntimeError, "input() already active"
Ecco il mio codice:
def func(inplace):
for line in fileinput.input(sys.argv[1], inplace=inplace):
[..]
if condition:
return True
[..]
if func(False):
func(True)
mi aspetterei questo comportamento quando si utilizza yield
ma non quando si utilizza il ritorno.
Sto usando Python 2.7.3.
C'è un modo per forzare un reset di fileinput?
EDIT:
Quando si chiama fileinput.close()
prima di tornare funziona. Perché non è fatto implicitamente?
EDIT 2: Grazie a @MatsLindh
Sostituzione
for line in fileinput.input(sys.argv[1], inplace=inplace):
con
for line in fileinput.FileInput(sys.argv[1], inplace=inplace):
fa quello che voglio, perché restituisce un oggetto che va out-of-scope in un modo definito. Ho pensato che lo fileinput.input()
lo facesse, ma no. Sta usando un'istanza globale.
Perché ti aspetti questo? Python non garantisce la pulizia al blocco (è solo cpython che di solito lo fa, ma solo quando non ci sono cicli di riferimento). – dhke
La raccolta dei dati inutili può verificarsi in qualsiasi momento; e ci sono le condizioni in cui gli oggetti vengono liberati e puliti. Se vuoi che l'oggetto file venga chiuso quando esci dal blocco usa '' with'' –
@JamesMills Penso che dovresti rendere il tuo commento una risposta. Sembra essere questo, IMHO. –