Folgendes berücksichtigen:
with open(path, mode) as f:
return [line for line in f if condition]
Wird die Datei ordnungsgemäß geschlossen oder wird return
der Kontextmanager irgendwie umgangen ?
python
return
with-statement
Leichte Brise
quelle
quelle
else
könnte hinzugefügt werdenwith
, um diesestry with except
Problem zu lösen . bearbeiten: zur Sprache hinzugefügtProcess.terminate()
ist es eines der wenigen (einzigen?) Szenarien, die den Aufruf einerfinally
Anweisung nicht garantieren : "Beachten Sie, dass Exit-Handler und schließlich Klauseln usw.os._exit
wird manchmal verwendet - es beendet den Python-Prozess, ohne Bereinigungshandler aufzurufen.with
Block zurückgebe, bleibt die Garantie so lange bestehen, wie der Generator weiterhin Werte liefert? solange irgendetwas darauf verweist? Muss ichdel
der Variablen, die das Generatorobjekt enthält, einen anderen Wert verwenden oder einen anderen Wert zuweisen?ValueError: I/O operation on closed file.
.Ja.
..ist ziemlich gleichbedeutend mit:
Genauer gesagt wird die
__exit__
Methode in einem Kontextmanager beim Verlassen des Blocks immer aufgerufen (unabhängig von Ausnahmen, Rückgaben usw.). Die__exit__
Methode des Dateiobjekts ruft nur auff.close()
(z. B. hier in CPython ).quelle
finally
Schlüssel erhalten, ist :def test(): try: return True; finally: return False
.Ja. Im Allgemeinen wird die
__exit__
Methode eines With Statement Context Managers tatsächlich aufgerufen, wenn einreturn
Kontext innerhalb des Kontexts angezeigt wird . Dies kann mit folgendem getestet werden:Die Ausgabe ist:
Die obige Ausgabe bestätigt, dass
__exit__
trotz des frühen aufgerufen wurdereturn
. Daher wird der Kontextmanager nicht umgangen.quelle
Ja, aber in anderen Fällen kann es zu Nebenwirkungen kommen, da im
__exit__
Block möglicherweise etwas getan werden sollte (z. B. das Löschen des Puffers)quelle