gibt es eigentlich einen prinzipiellen Unterschied zwischen:
(a)
for zeile in open(datei):
tu_was()
und:
(b)
with open(datei) as f:
for zeile in f:
tu_was()
Ist eine der beiden Mᅵglichkeiten schneller, besser, schᅵner?
Wenn ja, warum?
Schᅵne Grᅵᅵe, Matthias
b) ist schöner. Denn der Kontextmanager von file(), bestehend aus den
Methoden __enter__() (die wohl nur aus dem Äquivalent von return self
besteht) und __exit__() sorgt in letzterer dafür, daß das Objekt
geschlossen wird.
Bei a) wird das Objekt zwar auch (meistens) geschlossen, wenn das
Dateiobjekt "fallengelassen" wird, aber das geht dann über __del__, und
für deren Aufruf gibt es unter gewissen Umständen keine Garantie (bzw.
es ist sogar spezifiziert, daß sie nicht aufgerufen wird):
http://docs.python.org/reference/datamodel.html#object.__del__
Thomas
> Hallo,
>
> gibt es eigentlich einen prinzipiellen Unterschied zwischen:
>
> (a)
> for zeile in open(datei):
> tu_was()
Hier wird die Datei erst geschlossen, wenn die Garbage-Collection das file-
Objekt freigibt. Das geschieht bei CPython sofort nach der for-Schleife;
andere Implementierungen wie Jython und IronPython können sich dabei mehr
Zeit lassen.
> und:
>
> (b)
> with open(datei) as f:
> for zeile in f:
> tu_was()
Hier garantiert die Spezifikation, dass die Datei bei Verlassen der with-
Suite geschlossen wird. (b) ersetzt das alte etwas umständliche
(c)
f = open(...)
try:
...
finally:
f.close()
> Ist eine der beiden Möglichkeiten schneller, besser, schöner?
> Wenn ja, warum?
In der Praxis ist der Unterschied oft zu vernachlässigen; die 'with'-
Variante ist aber die konzeptionell sauberere Lösung. Da sie kaum
Mehraufwand erfordert, wird sie sich wohl jenseits von kurzlebigen Skripten
stärker durchsetzen als (c).
Peter
Schöne Grüße, Matthias