2013-02-08 6 views
12

Ich bin neugierig, ob es als sicher oder gute Praxis angesehen wird, sich auf Pythons mit ... als Anweisung zu verlassen. Zum Beispiel beim Öffnen einer Datei:Ist es eine gute Übung, sich auf Pythons mit ... als Anweisung zu verlassen

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

Also in diesem Beispiel, das ich ausdrücklich myFile.close() vernachlässigt nennen aber ich es genannt wurde übernehmen kann, wenn Python die with...as Anweisung durch den Aufruf der Objekte __exit__() Methode verlassen. Ist es gute Praxis/safe auf diese angewiesen oder wäre es besser, explizit file.close()

+0

Ist Ihnen bekannt, dass Ihr Beispielcode versucht hat, aus einer Datei zu lesen, die zum Schreiben geöffnet wurde? – geoffspear

+0

Hoppla, habe gerade ein schnelles Beispiel geschrieben, jetzt behoben. – Blaine

Antwort

17

Dies ist, was Kontext-Manager sind für, immer rufen sie verlassen, um die Datei für Sie zu schließen. Kontextmanager werden auch dann aufgerufen, wenn eine Ausnahme vorlag.

Die Alternative ist stattdessen ein finally Block zu verwenden:

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

sondern weil der Block innerhalb des try: lang sein kann, durch die Zeit, die Sie auf die finally Anweisung erhalten haben Sie vergessen, was Sie diese Einstellung wurden für.

Kontext-Manager sind noch leistungsfähiger. Da die __exit__-Methode über Ausnahmen informiert wird, können sie auch als Ausnahmehandler fungieren (die Ausnahme ignorieren, eine andere auslösen usw.).

4

Ja, die with Aussage ist besser Weg. Seit Python 2.5 wurde das Dateiobjekt mit den Methoden __enter__() und __exit__() ausgestattet. Die Methode __exit__() schließt das Dateiobjekt.

Python garantiert, dass es die __exit__() Methode nennen, aber es garantiert nicht, dass die __exit__() Methode, um die Ressource zu schließen, vor allem mit 3rd-Party-Code. Sie müssen dies manuell überprüfen.

Verwandte Themen