Lohnt es sich, Dateien in kleinen Funktionen zu schließen?

8

Sagen Sie, Sie haben:

%Vor%

Meine erste Frage ist: Lohnt es sich, die try / finally (oder with) Aussage zu haben? Wird die Datei beim Beenden der Funktion (über die Garbage Collection) nicht geschlossen?

Ich stieß darauf, nachdem ich eine Rezeptform von Martellis "Python Kochbuch" gelesen habe, wo

%Vor%

kommt mit dem Kommentar: "Wenn Sie dies tun, haben Sie keinen Verweis mehr auf das Dateiobjekt, sobald die Leseoperation abgeschlossen ist. In der Praxis bemerkt Python das Fehlen einer Referenz auf einmal und schließt die Datei sofort . "

Mein Funktionsbeispiel ist fast gleich. Sie haben eine Referenz, es ist nur so, dass die Referenz eine sehr kurze Lebensdauer hat.

Meine zweite Frage ist: Was bedeutet "sofort" in Martellis Aussage? Auch wenn Sie überhaupt keine Referenz haben, passiert das Schließen der Datei sowieso nicht zur Zeit der Speicherbereinigung?

    
Ioan Alexandru Cucu 10.07.2012, 08:24
quelle

1 Antwort

12

Es empfiehlt sich, die Datei selbst zu schließen. Die with -Anweisung führt zu sauberem Code und schließt die Datei automatisch (was eine gute Sache ist).

Obwohl Python eine High-Level-Programmiersprache ist, müssen Sie immer noch die Kontrolle darüber haben, was Sie tun. Als Faustregel gilt: Wenn Sie eine Datei öffnen, muss sie ebenfalls geschlossen werden. Es gibt nie einen guten Grund, in deinem Code schlampig zu sein: -)

In Bezug auf Ihre zweite Frage: Es wird nicht sofort ausgeführt, es wird ausgeführt, wenn der Garbage Collector entscheidet, dass es Zeit zum Ausführen ist. Wenn das Dateiobjekt freigegeben wird, schließt Python die Datei. Hier sind einige Artikel zur Garbage Collection in Python (siehe auch das Modul gc ), Es ist eine interessante Lektüre.

Es zeigt auch, dass die Garbage-Collection von Python einen Schwellenwert verwendet, der auf der Anzahl der zugewiesenen und freigegebenen Objekte basiert, bevor sie sich entscheidet, die Daten zu sammeln. Wenn Ihre Datei groß ist, hält Python die Datei möglicherweise länger als nötig offen, da der Speicherbereinigungscode möglicherweise noch nicht ausgeführt wurde.

    
Simeon Visser 10.07.2012, 08:27
quelle

Tags und Links