Seite 1 von 2

Verfasst: Mittwoch 7. Januar 2009, 20:50
von lunar
snafu hat geschrieben:@lunar: Selbst wenn ich jetzt mehrere Zeilen (z.B. für mehrere Module) ausgeben und diese Ausgabe tatsächlich durch ein Programm wie "head" begrenzen würde, dann wäre das Dateiobjekt aber in meinem Fall trotzdem geschlossen, bevor das print aus main() etwas in die Konsole schreibt, oder? Also jetzt bezogen auf die Variante ohne "finally".
Vom "Datei-Objekt" kann man ja nicht mehr sprechen, da der Python-Interpreter zu diesem Zeitpunkt tot ist. Auf Betriebssystemebene werden die Ressourcen des Prozesses auf jeden Fall geschlossen, allerdings liegt zwischen dem Python-Interpreter und dem System noch die Standardbibliothek von C, die meist noch puffert. Dieser interne Puffer geht verloren, wenn sich das Programm nicht sauber beendet. Wenn man nur liest, ist das egal, weil der Puffer eh nur wiedergibt, was sich auf der Festplatte befindet.

Beim Schreiben allerdings gehen unter Umständen Daten verloren, deshalb sollte man Dateien, in die man schreibt, immer mit finally schließen oder innerhalb eines with-Statements verwenden. Nur so kann garantiert werden, dass die internen Puffer sauber gelehrt werden, sprich dass alle Daten, die man per "write" in die Datei schreibt, auch wirklich auf der Platte landen.

Verfasst: Mittwoch 7. Januar 2009, 21:08
von cofi
Leonidas hat geschrieben:Statt ``if f == None:`` besser ``if f is None`` denn ``None`` ist tatsächlich ein Singleton und man kann auf Objektidentität testen.
In dem Sinne kannst du auch `if module == '':' anpassen -> `if not module:'

Verfasst: Donnerstag 8. Januar 2009, 05:09
von str1442
try: return ... except / finally: funktioniert immer.

Verfasst: Donnerstag 8. Januar 2009, 13:37
von BlackJack
@cofi: Das geht nicht, weil vom ersten Fall dann auch `None` erfasst würde, das im gezeigten Quelltext aber anders behandelt werden soll als die leere Zeichenkette.

Verfasst: Donnerstag 8. Januar 2009, 13:58
von cofi
Wobei die Trennung von leeren Strings und None keinen großen Sinn ergibt bzw man bei None ebenfalls den ImportError (oder vielleicht besser einen ValueError?) raisen könnte.

Verfasst: Donnerstag 8. Januar 2009, 19:49
von snafu
Da muss ich widersprechen. None und ein leerer String als ein an die Funktion übergebenes Argument sollen gleich behandelt werden. Die Funktion gibt nur ein None _zurück_, wenn das Modul zwar existiert, aber keine eigene py-Datei hat. Denn dann is "f" None.

Das mit dem ValueError ist eine gute Idee. Werde ich einbauen...