2013-02-08 10 views
12

Sono curioso di sapere se è considerato sicuro o una buona pratica dipendere da Python con ... come una dichiarazione. Per esempio, quando si apre un file:E 'buona pratica dipendere da Python con ... come affermazione

with open("myfile","w") as myFile: 
    #do something 

Quindi in questo esempio ho trascurato di chiamare esplicitamente myFile.close() tuttavia posso supporre è stato chiamato quando pitone uscito la dichiarazione with...as chiamando gli oggetti __exit__() metodo. È una buona pratica/sicuro per dipendono da questo o sarebbe meglio sempre in modo esplicito chiamare file.close()

+0

Sei consapevole che il tuo codice di esempio ha provato a leggere da un file che è stato aperto per la scrittura? – geoffspear

+0

Oops, ho appena scritto un breve esempio, ora risolto. – Blaine

risposta

17

Questo è ciò che i manager di contesto sono per, a fare affidamento su di loro per chiudere il file per te. I gestori del contesto vengono chiamati anche se c'è stata un'eccezione.

L'alternativa è quella di utilizzare un blocco finally invece:

myFile = open("myfile","w") 
try: 
    # do something with myFile 
finally: 
    myFile.close() 

ma perché il blocco all'interno del try: potrebbe essere lungo, per il momento si arriva alla dichiarazione finally avete dimenticato quello che l'impostazione di questa pronto a.

I gestori di contesto sono ancora più potenti. Poiché il metodo __exit__ viene informato di eventuali eccezioni, può anche agire come gestori di eccezioni (ignorare l'eccezione, sollevare un altro, ecc.).

4

Sì, la dichiarazione with è migliore. Da Python 2.5, l'oggetto file è stato equipaggiato con i metodi __enter__() e __exit__(). Il metodo __exit__() chiude l'oggetto file.

Python garantisce che chiamerà il metodo __exit__(), ma non è garantito che il metodo __exit__() chiuda la risorsa, in particolare con codice di terze parti. Devi verificarlo manualmente.

Problemi correlati