Ist dies der richtige Weg, um die Python-Anweisung "with" in Kombination mit einem Try-Except-Block zu verwenden?:
try:
with open("file", "r") as f:
line = f.readline()
except IOError:
<whatever>
Wenn ja, dann unter Berücksichtigung der alten Vorgehensweise:
try:
f = open("file", "r")
line = f.readline()
except IOError:
<whatever>
finally:
f.close()
Ist der Hauptvorteil der "with" -Anweisung hier, dass wir drei Codezeilen entfernen können? Es scheint mir für diesen Anwendungsfall nicht so überzeugend zu sein (obwohl ich verstehe, dass die "with" -Anweisung andere Verwendungszwecke hat).
EDIT: Ist die Funktionalität der beiden oben genannten Codeblöcke identisch?
EDIT2: Die ersten Antworten sprechen allgemein über die Vorteile der Verwendung von "mit", aber diese scheinen hier von geringem Nutzen zu sein. Wir alle haben f.close () jahrelang explizit aufgerufen (oder hätten es auch tun sollen). Ich nehme an, ein Vorteil ist, dass schlampige Codierer von der Verwendung von "with" profitieren.
Antworten:
finally
Klausel, da diesef
nicht gebunden ist.Der entsprechende alte Stilcode wäre:
Wie Sie sehen können, kann die
with
Anweisung die Fehleranfälligkeit verringern. In neueren Versionen von Python (2.7, 3.1) können Sie auch mehrere Ausdrücke in einerwith
Anweisung kombinieren . Beispielsweise:Außerdem halte ich es persönlich für eine schlechte Angewohnheit, Ausnahmen so früh wie möglich zu erwischen. Dies ist nicht der Zweck von Ausnahmen. Wenn die E / A-Funktion, die fehlschlagen kann, Teil einer komplizierteren Operation ist, sollte der IOError in den meisten Fällen die gesamte Operation abbrechen und daher auf einer äußeren Ebene behandelt werden. Mit
with
Anweisungen können Sie alle diesetry...finally
Anweisungen auf inneren Ebenen entfernen.quelle
Wenn der Inhalt des
finally
Blocks durch die Eigenschaften des zu öffnenden Dateiobjekts bestimmt wird, warum sollte der Implementierer des Dateiobjekts nicht derjenige sein, der denfinally
Block schreibt ? Das ist der Vorteil derwith
Anweisung, viel mehr als das Speichern von drei Codezeilen in dieser speziellen Instanz.Und ja, die Art
with
und Weise, wie Sie kombiniert haben,try-except
ist so ziemlich die einzige Möglichkeit, dies zu tun, da außergewöhnliche Fehler, die in deropen
Anweisung selbst verursacht werden, nicht imwith
Block abgefangen werden können .quelle
Ich denke, Sie haben es falsch gemacht, wenn Sie mit "mit" sagen, dass es nur Zeilen reduziert. Es führt tatsächlich die Initialisierung durch und behandelt das Herunterfahren.
In Ihrem Fall tut "mit"
Hier ist ein Link zum Verständnis der "with" -Anweisung: http://effbot.org/zone/python-with-statement.htm
Bearbeiten: Ja, Ihre Verwendung von "mit" ist korrekt und die Funktionalität beider Codeblöcke ist identisch. Frage, warum "mit" verwendet werden soll? Es ist wegen der Vorteile, die Sie damit erhalten. wie du erwähnt hast über versehentlich fehlendes f.close ().
quelle
Der pythonischere Weg für die folgenden Codes ist:
quelle
readline()
Aufruf hinzufügen , schließt Ihre Version die Datei nicht, wenn dasreadline()
Ergebnis zu einem führtIOError
.